perm filename DFTP.MAC[NET,MRC]13 blob sn#278589 filedate 1977-04-26 generic text, type T, neo UTF8
	TITLE	DFTP  Datacomputer File Transfer Program

; Bugs/Gripes to Bug-DFTP at MIT-AI
; Current DFTP hackers:  WRB@CCA(general, TENEX, TOPS-10)
;			 MRC@MIT-AI(ITS, SU-AI, TOPS-10)

IFNDEF F.TENX,<F.TENX==1>	; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX/TWENEX

IFNDEF F.PCAP,<F.PCAP==0>	; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED

IFNDEF F.SAIL,<F.SAIL==0>	; -1 IF TOPS-10 VERSION FOR SAIL
IFN F.SAIL,<F.TENX==0>

IF1,<
IFL F.TENX,<PRINTX ITS...>
IFE F.TENX,<IFE F.SAIL,<PRINTX TOPS-10...>
	IFN F.SAIL,<PRINTX SAIL...>
>
IFG F.TENX,<PRINTX TENEX...>
IFN F.PCAP,<PRINTX Privileged capabilities restricted>
>

; ***DEFINITIONS***

	DCHOST==37
	DCSOKT==203

	DEFALO==12

	SIZBLK==200
	SIZPAG==1000

	LBSIZE==100
	SBSIZE==20

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	X1==1
	X2==2
	X3==3
	X4==4

;	(COMMONLY USED REGISTERS)
	IO==R5
	BP==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

; MACRO DEFINITIONS

	SALL

IFL F.TENX,<DEFINE RELOC(ADDR)<LOC ADDR>>	; ABS ASSEMBLY ON ITS

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>

DEFINE	TAIN(MSG)
<	HRRZI	X1,MSG
	CALLR	$TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE	TCIO,[RSTR,,CLIST]
	CALLR	$TCIN$>
DEFINE	TCIL(ARG)
<	..CMCH==0
	..CMWD==0
	..CNUM==0
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..CNUM==..CNUM+1
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
		..FLAG==<-..FLAG>>
	IFL ..FLAG,<!!
		PRINTX BAD ARGUMENTS TO TCIN>
	..CMWD==<<<..CMCH-1>/5>+1>
	..LOC1==.
	..LOC2==..LOC1+4
	..LOC3==..LOC2+..CNUM
	RELOC ..LOC3
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
			ASCII	/ARG/
			IFG ..IDX,<REPEAT ..IDX, <0>>
			..LOC3==.>
		IFL ..FLAG,<
			RELOC ..LOC2
			ARG
			..LOC2==.
			RELOC ..LOC3>
		..FLAG==<-..FLAG>>
	RELOC ..LOC1
	..LOC2
	..CNUM
	..CMCH
	..CMWD
	RELOC ..LOC3>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE	IO,[BUFFER,,5*BUFS]
	IFB <NOECHO>,< HRRZI	UTIL,MSG>
	IFNB <NOECHO>,< HRROI	UTIL,MSG>
	CALLR	$TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE	IO,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE	IO,[MSG,,RADIX]>
	CALLR	$TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRRZI	X2,↑D10>
	IFNB <RADIX>,< HRRZI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRROI	X2,↑D10>
	IFNB <RADIX>,< HRROI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI	FLAG,STRING>
	IFNB <FLAGS>,<
		HRRI	FLAG,STRING
		HRLI	FLAG,FLAGS>
	CALLR	$PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	ILDB	0,SOURCE
	JUMPE	0,.+3
	IDPB	0,DESTIN
	JRST	.-3
	MOVE	SOURCE,DESTIN
	IDPB	0,SOURCE>

; SYSTEM DEPENDENT DEFINITIONS

; ((ITS))
IFL F.TENX,<
	SEARCH SITS
	LOC 150

	OPDEF THUD [.LOSE 1000]

;  Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO.  First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).

INIT:	MOVSI (JUMPA)
	HRR .JBSA##
	.BREAK 12,[400001,,]		;set start address
	SETZ 1,
	MOVE [1,,2]
	BLT 150
	.BREAK 16,100000		;return to DDT
	JRST DFTP

; I/O Channels

	TTI==1		; TTY I/O
	TTO==2
	DCI==3		; Datalanguage I/O
	DCO==4
	ICP==5		; ICP channel
	DDI==6		; Data I/O
	DDO==7
	LCI==10		; Local input
	LCO==11		; Local output
 
; ITS network definitions

%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11

DEFINE TBIN(REG)
<	.IOT TTI,REG
	CAIN REG,15
	 MOVEI REG,12
	CAIG REG,"z"
	 CAIGE REG,"a"
	  CAIA
	   TRZ REG," ">

OPDEF TBOUT [.IOT TTO,]


DEFINE TSOUT(STRING)
<	IRP STRING
<	MOVEI X1,STRING
	CALLR $STRIN
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$STRIN:	BEGINR
	HRLI X1,(POINT 7,)		; build a byte pointer
$STRI1:	ILDB X1				; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT TTO,			; output the character
	JRST $STRI1
	ENDR

DEFINE DCBIN(REG)
<	.IOT DCI,REG
	JUMPLE REG,QUIT2
	SKIPE FLAGDD
	 .IOT TTO,REG
>

OPDEF DCBOUT [.IOT DCO,]

DEFINE DCSOUT(STRING)
<	IRP STRING
<	MOVEI X1,STRING
	CALLR $DSTRI
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$DSTRI:	BEGINR
	HRLI X1,(POINT 7,)		; build a byte pointer
$DSTR1:	ILDB X1				; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT DCO,			; output the character
	SKIPE FLAGDD			; show DATALANGUAGE?
	 .IOT TTO,
	JRST $DSTR1			; and loop for more
	ENDR
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
	TWOSEG
	RELOC	400000

	OPDEF THUD [JSP FLAG,OOPS]

IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBIN(REG)
<	TTCALL	0,REG
	CAIE REG,175
	 CAIN REG,176
	  MOVEI REG,33
	CAILE	REG,"Z"+40
	 JRST	.+3
	CAIL	REG,"A"+40
	 SUBI	REG,40>
OPDEF TBOUT [TTCALL 1,]
DEFINE	TSOUT(STRING)
<	IRP STRING
<	TTCALL	3,STRING>>

DEFINE	DCBIN(REG)
<	SKIPG	DCIBUF+2
	CALLR	NUTMI
	SOS	DCIBUF+2
	ILDB	REG,DCIBUF+1
	JUMPE REG,.-4>
DEFINE	DCBOUT(REG)
<	IDPB	REG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI	X1,STRING
	CALLR	NUTMO>
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
	SEARCH	STENEX

	THUD==-1

DEFINE	TBIN(REG)
<	PBIN
	CAILE	X1,"Z"+40
	 JRST	.+3
	CAIL	X1,"A"+40
	 SUBI	X1,40
	IFN	<X1-REG>,< HRRZI	REG,(X1)>>
DEFINE	TBOUT(REG)
<	IFN	<X1-REG>,< HRRZI	X1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	X1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	X1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	X1,(X2)
	PBOUT
	HRRZI	REG,(X2)>
DEFINE	DCBOUT(REG)
<	MOVE	X1,DCOJFN
	HRRZI	X2,(REG)
	BOUT
	MOVEI	X2,21
	MTOPR>
DEFINE	DCSOUT(STRING)
<	..IDX==1
	IRP STRING<..IDX==..IDX+2>
	SKIPN	FLAGDD
	 JRST	.+..IDX
	IRP STRING
<	HRROI	X1,STRING
	PSOUT>
	MOVE	X1,DCOJFN
	SETZ	X3,
	IRP STRING
<	HRROI	X2,STRING
	SOUT>
	MOVEI	X2,21
	MTOPR>
>
; (((↑↑↑)))

; "<FILE"> FILE LIST(0,55,256),CAT,B=36
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),C=1
; 	    EXTENSION STRING(0,3,79),C=1
; 	    STATUS STRING(1),F=' '
; 	    CREATIONDATE STRING(1,18,79),F='?',C=1
; 	    SAVEDATE STRING(1,18,79),F='?',C=1
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	INDEX BYTE,V=I
; 	COUNT BYTE
; 	DATA STRING(0,497,500000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<GET"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(79),F=' ',D=0
; 	    EXTENSION STRING(79),F=' ',D=0
; 	    CREATIONDATE STRING(19),F=' ',D=0
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,437,1000000),B=36,D=0
; 	CHECKSUM BYTE
;     END;
;
; "<PUT"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D=0
; 	    EXTENSION STRING(0,3,79),D=0
; 	    CREATIONDATE STRING(0,18,79),D=0
; 	    SAVEDATE STRING(0,18,79),D=0
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,497,1000000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<TERSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D='	'
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;
;
; "<VERBOSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D=' '
; 	    STATUS STRING(1),D='	'
; 	    CREATIONDATE STRING(1,18,79),D=' '
; 	    SAVEDATE STRING(1,18,79),D=' '
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;

; ***PROGRAM***

DFTP:
IFL F.TENX,<.SUSET [.RSNAME,,LCLSNM]
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 THUD				; INSIST ON AN ITS DIRECTORY
	.CLOSE				; THIS WILL PREVENT A THUD IN
					; LOCOO DUE TO BAD DIRECTORY
					; STORED IN LCLSNM.  LOCAL-CONNECT
					; CHECKS.
>
IFE F.TENX,<JFCL>
IFGE F.TENX,<RESET>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	CALLR	S$INIT
	CALLR	D$INIT

; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
IFL F.TENX,<			; HACK FOR ITS VERSION FOR AUTOENABLE
	MOVEI UTIL,CMDM3
	.OPEN ['DSK'
	       SIXBIT/←DFTP←/
	       SIXBIT/ENABLE/]
>
	 MOVEI UTIL,CMDM2	; CAN ENABLE LATER ON
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
;	(((ITS)))
	IFL F.TENX,<
		MOVEI UTIL,CMDM2
		.SUSET [.RXUNAME,,X1]
		.CALL [	SETZ
			SIXBIT/OPEN/
			MOVEI
			[('DSK')]
			['.FILE.']
			['(DIR) ']
			SETZ X1]
		MOVEI UTIL,CMDM1	; NO ITS DIRECTORY
>
;	(((↑↑↑)))
;	(((TOPS-10)))
	IFE F.TENX,<
		MOVEI	UTIL,CMDM1
;		(!DISABLE!)
>
;	(((↑↑↑)))
;	(((TENEX)))
	IFG F.TENX,<
		MOVEI	UTIL,CMDM1
		MOVEI	X1,400000	; FOR THIS FORK
		RPCAP
		TRNE	X2,600000	; (1B18+1B19) WHEEL OR OPER
		 MOVEI	UTIL,CMDM2
>
;	(((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<.CLOSE>
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD
CMDNEW:	TSOUT	<CRLF>
CMDCMD:	JRST	@CMDMOD
CMDM1:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC1,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM2:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC2,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM3:	TSOUT	<[ASCIZ/!/]>
	TCIN	(CMDMC3,[ASCIZ/!/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)

; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-CONNECT,CLOC,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,TERSE,CTER,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR,VERBOSE,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-CONNECT,CLOC,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,TERSE,CTER,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR,VERBOSE,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,LOCAL-CONNECT,CLOC,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,TERSE,CTER,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR,VERBOSE,CVER>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,LOCAL-STRUCTURE,CLOS,LOCAL-USER,CLOU,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,LOCAL-DIRECTORY,CLOD,LOCAL-STRUCTURE,CLOS,LOCAL-USER,CLOU,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,LOCAL-DIRECTORY,CLOD,LOCAL-STRUCTURE,CLOS,LOCAL-USER,CLOU,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,EXPUNGE,CEXP,GET,CGET,LINK,CLIN,LIST,CLIS,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,REMOVE,CREM,RENUMBER,CREN,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNDELETE,CUND,UNTIME-TRANSFERS,CUTR>
>
; (((↑↑↑)))

CALO:	PATH	([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ Megabits: /]>
CALO1:	TNIN	([ASCIZ/ Megabits: /])
	 JRST	CMDCMD
	JUMPN	IO,CALO2
	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	CALO1
CALO2:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DALO
	JRST	CMDCMD

CATT:	PATH	([ASCIZ/ ATTACH /],PATHNR!PATHCT)
	 JRST	CMDCMD
	CALLR	DATT
	JRST	CMDCMD

CCHA:	PATH	([ASCIZ/ CHANGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DCHA
	JRST	CMDCMD

CCON:	PATH	([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
	 JRST	CMDCMD
	CALLR	DCON
	JRST	CMDCMD

CCRE:	PATH	([ASCIZ/ CREATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	CALLR	DCRE
	JRST	CMDCMD

CDEL:	PATH	([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
	 JRST	CMDCMD
	CALLR	DDEL
	JRST	CMDCMD

CDIR:	PATH	([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CDIR1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CDIRC,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CDIRC,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR2:	MOVEI	FLAG,DD$T
	TSOUT	<[ASCIZ/TERSE/]>
CDIR3:	TSOUT	<CRLF>
	CALLR	DDIR
	JRST	CMDCMD
CDIRC:	TCIL	<DELETED,DD$D,TERSE,DD$T,VERBOSE,DD$V>

CDIS:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM2
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CENA:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM3
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

; (((TENEX)))
IFG F.TENX,<
CEXE:	HRROI	X1,CRLF
	PSOUT
	HRLZI	X1,(1B1)	; INFERIOR GETS THIS FORK'S CAPABILITIES
	CFORK			; CREATE FORK
	 JRST	CMDCMD
	HRLI	UTIL,(X1)
	HRLZI	X1,(1B2+1B17)
	SKIPN	FLAG20
	 HRROI	X2,[ASCIZ/<SYSTEM>EXEC.SAV/]
	SKIPE	FLAG20
	 HRROI	X2,[ASCIZ/<SYSTEM>EXEC.EXE/]
	GTJFN
	 JRST	CEXE0
	HRRI	UTIL,(X1)
	HRRZI	X1,-1
	RFMOD
	MOVE	R10,X2
	SKIPN	FLAG20
	 JRST	.+3
	TRO	X2,004000
	SFMOD
	RFCOC
	MOVE	R11,X2
	MOVE	R12,X3
	MOVE	X1,UTIL
	GET			; LOAD EXEC INTO FORK
	HLR	X1,UTIL
	SETZ	X2,
	SFRKV			; START FORK AT MAIN STARTUP
	WFORK
	HRRZI	X1,-1
	MOVE	X2,R10
	SFMOD
	MOVE	X2,R11
	MOVE	X3,R12
	SFCOC
CEXE0:	HLR	X1,UTIL
	KFORK
	JRST	CMDCMD
>
; (((↑↑↑)))

CEXP:	PATH	([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DEXP
	JRST	CMDCMD

CGET:	PATH	([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CLIN:	TSOUT	<CRLF>
	CALLR	DLIN
	JRST	CMDCMD

CLIS:	PATH	([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CLIS1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CLISC1,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CLISC2,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS2:	MOVEI	FLAG,DL$T
	TSOUT	<[ASCIZ/TERSE/]>
CLIS3:	TSOUT	<CRLF>
	CALLR	DLIS
	JRST	CMDCMD
CLISC1:	TCIL	<TERSE,DL$T,VERBOSE,DL$V>
CLISC2:	TCIL	<PROTECTION,DL$P,TERSE,DL$T,VERBOSE,DL$V>

; (((ITS)))
IFL F.TENX,<
CLOC:	TBOUT [" "]
	SETZM ABUF
	SETZM ABUF+1
	MOVE IO,[ABUF,,6]
	HRRZI UTIL,[ASCIZ/ LOCAL-CONNECT /]
	CALLR $TSIN$
	 JRST CMDCMD
	JUMPE UTIL,[	.SUSET [.RSNAME,,LCLSNM]
			TSOUT <[ASCIZ/(default)/],CRLF>
			JRST CMDCMD]
	TSOUT <CRLF>
	SETZM LCLSNM
	MOVE X1,[POINT 6,LCLSNM]
	MOVE X2,[POINT 7,ABUF]
	ILDB X2
	SUBI " "
	IDPB X1
	SOJG UTIL,.-3
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 JRST [	TSOUT <[ASCIZ/ (No such directory)/],CRLF,[ASCIZ/ LOCAL-CONNECT/]>
		JRST CLOC]
	.CLOSE
	JRST CMDCMD
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
CLOD:	TTCALL	3,CRLF
	SETZM	LUTDSP
CLOD1:	CALLR	LUTDS
	 JRST	CMDCMD
	TTCALL	1,[" "]
	TTCALL	3,LUTDSF
	TTCALL	3,CRLF
	JRST	CLOD1

CLOS:	MOVEI	IO," "
	TTCALL	1,IO
	TSIN	(UBUF2,SBSIZE,[ASCIZ/ LOCAL-STRUCTURE /])
	 JRST	CMDCMD
	TTCALL	3,CRLF
	MOVE	BP,[440700,,UBUF2]
CLOS1:	ILDB	IO,BP
	JUMPE	IO,CLOS2
	CAIE	IO,":"
	 JRST	CLOS1
	SETZ	IO,
	DPB	IO,BP
CLOS2:	HRRZI	IO,UBUF2
	CALLR	LUTFN
	MOVE	IO,LFILE
	DEVCHR	IO,
	TLNE	IO,200000
	 JRST	CLOS3
	TTCALL	3,[ASCIZ/ (Local structure must be a disk)
/]
	JRST	CMDCMD
CLOS3:	MOVE	IO,LFILE
	MOVEM	IO,LFCHAS+1
	JRST	CMDCMD

CLOU:	TTCALL	3,[ASCIZ/
 Project: /]
IFE F.SAIL,<
	TNIN	([ASCIZ/ Project: /],10)
	 JRST	CMDCMD
>
IFN F.SAIL,<
	SETZM ABUF
	MOVE IO,[ABUF,,3]
	HRRZI UTIL,[ASCIZ/ Project: /]
	CALLR $TSIN$
	 JRST CMDCMD
	SETZ IO,
	MOVE X1,[POINT 7,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU1A
	LSH IO,6
	ADDI IO,-" "(X2)
>
>
CLOU1A:	HRLI	UTIL,(IO)
	JUMPN	IO,CLOU1
	GETPPN IO,
	 JFCL
	HLLZ UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU1:	TTCALL	3,[ASCIZ/
 Programmer: /]
IFE F.SAIL,<
	TNIN	([ASCIZ/ Programmer: /],10)
	 JRST	CMDCMD
>
IFN F.SAIL,<
	PUSH STAK,UTIL
	SETZM ABUF
	MOVE IO,[ABUF,,3]
	HRRZI UTIL,[ASCIZ/ Programmer: /]
	CALLR $TSIN$
	 JRST [	POP STAK,UTIL
		JRST CMDCMD]
	SETZ IO,
	POP STAK,UTIL
	MOVE X1,[POINT 7,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU2A
	LSH IO,6
	ADDI IO,-" "(X2)
>
>
CLOU2A:	HRRI	UTIL,(IO)
	JUMPN	IO,CLOU2
	GETPPN IO,
	 JFCL
	HRR UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU2:	TTCALL	3,CRLF
	RELEAS	LDCHAN,
	MOVEM	UTIL,LDIR
	MOVE	IO,[SIXBIT/UFD/]
	MOVEM	IO,LDIR+1
	SETZM	LDIR+2
IFE F.SAIL,<MOVE IO,[1,,1]>
IFN F.SAIL,<MOVE IO,[SIXBIT/  1  1/]>
	MOVEM	IO,LDIR+3
	MOVE	IO,LFCHAS+1
	MOVEM	IO,LDCHAS+1
	OPEN	LDCHAN,LDCHAS
	 JRST	CLOU4
	LOOKUP	LDCHAN,LDIR
	 JRST	CLOU4
	RELEAS	LDCHAN,
	MOVEM UTIL,LFIPPN
	JRST	CMDCMD
CLOU4:	 TTCALL	3,[ASCIZ/ (No such directory)
/]
	JRST	CMDCMD
>
; (((↑↑↑)))

CNOD:	SETZM	FLAGDD
	JRST	CMDNEW

CPUT:	PATH	([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CQUI:	TAIN	<[ASCIZ/ [Confirm]/]>
	 JRST	CMDCMD
	 JRST	CMDCMD
	JRST	QUIT

CREM:	PATH	([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
	 JRST	CMDCMD
	CALLR	DREM
	JRST	CMDCMD

CREN:	PATH	([ASCIZ/ RENUMBER /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	SKIPLE	VBUF
	 JRST	CREN2
	SKIPE	VBUF
	 JRST	CREN1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 JRST	CREN1
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 JRST	CREN1
	JRST	CREN2
CREN1:	TSOUT	<[ASCIZ/ (A version number is required if *'s are used.)/],CRLF>
	JRST	CMDCMD
CREN2:	TSOUT	<[ASCIZ/ New version number: /]>
	TNIN	([ASCIZ/ New version number: /])
	 JRST	CMDCMD
	JUMPN	IO,CREN3
	MOVEI	IO,"1"
	TBOUT	<IO>
	MOVEI	IO,1
CREN3:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DREN
	JRST	CMDCMD

CRET:	PATH	([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CSOD:	SETOM	FLAGDD
	JRST	CMDNEW

CSTO:	PATH	([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CTER:	SETOM FLAGNN
	SETZM FLAGDD
	SETZM FLAGTT
	JRST CMDNEW

CTTR:	SETOM	FLAGTT
	JRST	CMDNEW

CUND:	PATH	([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	CALLR	DUND
	JRST	CMDCMD

CUTR:	SETZM	FLAGTT
	JRST	CMDNEW

CVER:	SETZM FLAGNN
	JRST CMDNEW

; ***PATH INPUT AND TRANSLATION***

; FLAG DEFINITIONS
	PATHNR==400000		; NODE REQUIRED
	PATHNP==200000		; NODE POSSIBLE
	PATHNF==100000		; NODE FOUND
	PATHFR==040000		; FILE REQUIRED
	PATHFF==020000		; FILE FOUND
	PATHCT==004000		; CONTEXT TOP
	PATHCA==002000		; CONTEXT ATTACH
	PATHCC==001000		; CONTEXT CONNECT
	PATHLR==000400		; LOCAL TO REMOTE
	PATHRL==000200		; REMOTE TO LOCAL
	PATHAS==000040		; ALLOW SETS
	PATHAD==000020		; ALLOW (NON-SET) DEFAULT
	PATHAV==000010		; ALLOW VERSIONS
	PATHAC==000004		; ACKNOWLEDGE [CONFIRM]

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHLR
	 TLO	FLAG,PATHAV
>
; (((↑↑↑)))
	MOVEI	IO," "
	TBOUT	<IO>
	MOVE	IO,[GBUF1,,5*LBSIZE]
	SETZ	UTIL,
	CALLR	P$IN
	 RETURN
	PUSH	STAK,IO
	MOVE	IO,[GBUF1,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	POP	STAK,IO
	MOVEM	UTIL,VBUF
	TLNN	FLAG,PATHAC
	 JRST	PAT$10
	TAIN	<[ASCIZ/ [Confirm]/]>
	 RETURN
	 RETURN
	RETURN	SKIP,1
PAT$10:	TLNE	FLAG,PATHRL!PATHLR
	 JRST	PAT$11
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$11:	PUSH	STAK,IO
	MOVE	IO,[FBUF,,EBUF]
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHRL
	 SETZ	UTIL,
>
; (((↑↑↑)))
	CALLR	P$LF
	POP	STAK,IO
	CAIN	IO,33
	 JRST	PAT$20
	CAIN	IO," "
	 JRST	PAT$20
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$12:	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$12:	SKIPE	LJFN
	 JRST	.+3
	HRROI	X1,CRLF
	PSOUT
>
; (((↑↑↑)))
	RETURN	SKIP,1
PAT$20:	TLNE	FLAG,PATHLR
	 JRST	PAT$21
	TLNE	FLAG,PATHRL
	 JRST	PAT$22
	JRST	PAT$23
PAT$21:	TLNE	FLAG,PATHNF
	 JRST	PAT$12
; (((TENEX)))
IFG F.TENX,<
	TLZ	FLAG,PATHAV
>
; (((↑↑↑)))
	JRST	PAT$23
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$22:	TLZ	FLAG,PATHNR!PATHNP!PATHAV
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$22:	SKIPN	LJFN
	 JRST	.+4
	HRROI	X1,CRLF
	PSOUT
	RETURN	SKIP,1
	TLZ	FLAG,PATHNR!PATHNP
>
; (((↑↑↑)))
PAT$23:	TSOUT	<[ASCIZ/ [As] /]>
	MOVE	IO,[GBUF2,,5*LBSIZE]
	MOVE	UTIL,[GBUF1,,[ASCIZ/ [As] /]]
	CALLR	P$IN
	 RETURN
	TLNE	FLAG,PATHLR
	 JRST	PAT$24
	TLNE	FLAG,PATHRL
	 JRST	PAT$25
	RETURN
PAT$24:	MOVE	IO,[GBUF2,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	MOVEM	UTIL,VBUF
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$25:	MOVE	IO,[GBUF2,,GBUF1]
	MOVE	UTIL,[FSBUF,,ESBUF]
	CALLR	P$PP
	MOVE	IO,[FSBUF,,ESBUF]
	CALLR	P$LF
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LJFN
	 JRST	.+3
	HRROI	X1,CRLF
	PSOUT
>
; (((↑↑↑)))
	ENDR	SKIP,1

; PATH INPUT
;   IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IO -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$SE==100000		; SET ENCOUNTERED (*)
	P$I$TE==040000		; TRAILING NODE SET ENCOUNTERED (**)
	P$I$PW==010000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$EP==000400		; EXTENSION BEING PROCESSED
	P$I$VP==000200		; VERSION BEING PROCESSED
;
P$IN:	BEGINR	<BP,R10,R11,R12,R13>
	SETZ	R10,
	MOVE	R11,IO
	MOVE	R12,UTIL
	HLR	BP,IO
	HRLI	BP,(POINT 7,)
	SETZ	UTIL,
P$ICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	P$IREP
	CAIN	IO,"A"-100
	 JRST	P$IDEL
	CAIN	IO,"U"-100
	 JRST	P$IENR
	CAIN	IO,"X"-100
	 JRST	P$IENR
	CAIN	IO,177
	 JRST	P$IDEL
	CAIN	IO,15
	 JRST	P$ICHR
	CAIN	IO,12
	 JRST	P$IEND
	CAIN	IO,33
	 JRST	P$IEND
	CAIN	IO,37
	 JRST	P$IEND
	CAIGE	IO," "
	 JRST	P$IBAD
	CAIN	IO,42
	 JRST	P$IBAD
	TRNE	R10,P$I$TE
	 JRST	P$IBAD
	CAIL	UTIL,(R11)
	 JRST	P$IBAD
	TRNE	R10,P$I$PW
	 JRST	P$ICHP
	CAIN	IO," "
	 JRST	P$IEND
	CAIN	IO,"?"
	 JRST	P$IBAD
	CAIN	IO,"*"
	 JRST	P$ISS
	TRNE	R10,P$I$VP
	 JRST	P$ISVN
	CAIN	IO,";"
	 JRST	P$ISVS
	CAIN	IO,":"
	 JRST	P$IPON
	CAIN	IO,"<"
	 JRST	P$ISA
	CAIN	IO,">"
	 JRST	P$ISD1
	CAIN	IO,"."
	 JRST	P$ISD2
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$AE!P$I$DE
P$ICHE:	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	UTIL,P$ICHR
P$ICHP:	CAIN	IO,">"
	 JRST	P$IPOF
	CAIN	IO,"'"
	 JRST	P$IBAD
	IDPB	IO,BP
	AOJA	UTIL,P$ICHR
P$ISA:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNN	R10,P$I$CC
	 JRST	P$ISA1
	TRNN	R10,P$I$CA
	 JRST	P$ISA2
	TRNN	R10,P$I$CT
	 JRST	P$ISA3
	JRST	P$IBAD
P$ISA1:	JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$AE!P$I$CC
	JRST	P$ICHE
P$ISA2:	CAIE	UTIL,1
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CA
	JRST	P$ICHE
P$ISA3:	CAIE	UTIL,2
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CT
	JRST	P$ICHE
P$ISD1:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$EP
	 JRST	P$IBAD
	TLNN	FLAG,PATHFR
	 JRST	.+3
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TROE	R10,P$I$DE
	 JRST	P$IBAD
	TRZ	R10,P$I$SE
	JRST	P$ICHE
P$ISD2:	TLNN	FLAG,PATHFR
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$DE!P$I$EP
	 JRST	P$IBAD
	TRZ	R10,P$I$SE
	TRO	R10,P$I$DE!P$I$EP
	JRST	P$ICHE
P$ISVS:	TLNN	FLAG,PATHAV
	 JRST	P$IBAD
	TLNN	FLAG,PATHFR
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$VP
	 JRST	P$IBAD
	TRNN	R10,P$I$DE
	 JRST	.+3
	TRNN	R10,P$I$EP
	 JRST	P$IBAD
	TRZ	R10,P$I$SE!P$I$EP
	TRO	R10,P$I$VP!P$I$DE
	JRST	P$ICHE
P$ISVN:	CAIL	IO,"0"
	 CAILE	IO,"9"
	  JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$DE
	JRST	P$ICHE
P$ISS:	TLNN	FLAG,PATHAS
	 JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IST
	TRZN	R10,P$I$AE!P$I$DE
	 JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$SE
	JRST	P$ICHE
P$IST:	TLNE	FLAG,PATHFR
	 JRST	P$IBAD
	TRNE	R10,P$I$EP!P$I$VP
	 JRST	P$IBAD
	TRO	R10,P$I$TE
	JRST	P$ICHE
P$IPON:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNE	R10,P$I$AE!P$I$DE!P$I$SE
	 JRST	P$IBAD
	MOVEI	X1,1(UTIL)
	CAIL	X1,(R11)
	 JRST	P$IBAD
	IDPB	IO,BP
	TBOUT	<IO>
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	ADDI	UTIL,2
	TRO	R10,P$I$PW
	JRST	P$ICHR
P$IPOF:	MOVEI	X1,1(UTIL)
	CAIL	X1,(R11)
	 JRST	P$IBAD
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	IDPB	IO,BP
	TBOUT	<IO>
	ADDI	UTIL,2
	TRZ	R10,P$I$PW
	TRO	R10,P$I$DE
	JRST	P$ICHR
P$IBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	P$ICHR
P$IREP:	TSOUT	<CRLF>
	TSOUT	<(FLAG)>
	JUMPE	R12,P$IR04
	HLR	R13,R12
	HRLI	R13,(POINT 7,)
	TRZ	R10,P$I$PW
P$IR01:	ILDB	IO,R13
	JUMPE	IO,P$IR03
	CAIN	IO,"P"-100
	 JRST	P$IR02
	TRNE	R10,P$I$PW
	 JRST	P$IR01
	TBOUT	<IO>
	JRST	P$IR01
P$IR02:	TRC	R10,P$I$PW
	JRST	P$IR01
P$IR03:	TSOUT	<(R12)>
P$IR04:	HRRZI	IO,(BP)
	HLR	R13,R11
	CAIGE	IO,(R13)
	 JRST	P$ICHR
	HRLI	R13,(POINT 7,)
	TRZ	R10,P$I$PW
P$IR05:	CAMN	R13,BP
	 JRST	P$ICHR
	ILDB	IO,R13
	CAIN	IO,"P"-100
	 JRST	P$IR06
	TRNE	R10,P$I$PW
	 JRST	P$IR05
	TBOUT	<IO>
	JRST	P$IR05
P$IR06:	TRC	R10,P$I$PW
	JRST	P$IR05
P$IDEL:	JUMPE	UTIL,P$IENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	CAIN	IO,"P"-100
	 JRST	P$ID01
	LDB	X1,BP
	CAIN	X1,"P"-100
	 JRST	P$ID02
	TRNE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TBOUT	<IO>
	TRZ	R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
	CAIN	IO,"."
	 TRZ	R10,P$I$EP
	CAIN	IO,";"
	 TRZ	R10,P$I$VP
	CAIE	IO,"<"
	 JRST	P$ID00
	TRZE	R10,P$I$CT
	 JRST	P$ID00
	TRZE	R10,P$I$CA
	 JRST	P$ID00
	TRZ	R10,P$I$CC
P$ID00:	SUBI	UTIL,1
	JUMPE	UTIL,P$ICHR
	LDB	X1,BP
	CAIN	X1,"<"
	 TRO	R10,P$I$AE
	CAIN	X1,">"
	 TRO	R10,P$I$DE
	CAIN	X1,"."
	 TRO	R10,P$I$DE
	CAIN	X1,";"
	 TRO	R10,P$I$DE
	CAIN	X1,"*"
	 TRO	R10,P$I$SE
	JRST	P$ICHR
P$ID01:	TRZ	R10,P$I$PW
	LDB	IO,BP
	JRST	P$ID03
P$ID02:	TROE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TRZ	R10,P$I$DE
P$ID03:	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SUBI	UTIL,2
	JRST	P$ICHR
P$IENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IEND:	CAIN	IO,12
	 JRST	P$IENL
	CAIN	IO,37
	 JRST	P$IENL
	TLNN	FLAG,PATHAS
	 JRST	P$IENV
	JUMPE	UTIL,P$IENV
	LDB	R13,BP
	CAIN	R13,">"
	 JRST	P$IENT
	TLNN	FLAG,PATHFR
	 JRST	P$IENV
	TLNE	FLAG,PATHAS
	 JRST	P$IENV
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
	JRST	P$IENV
P$IENL:	TLNN	FLAG,PATHFR
	 JRST	P$IENV
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
P$IENV:	TRNN	R10,P$I$DE
	 JRST	.+3
	TRNN	R10,P$I$EP
	 JRST	P$IBAD
; (((TENEX)))
IFG F.TENX,<
	TLNN	FLAG,PATHFR
	 JRST	P$IE$6
	TLNN	FLAG,PATHLR!PATHRL
	 JRST	P$IE$6
	JUMPN	UTIL,P$IE$6
	JUMPE	R12,.+3
	TLNE	FLAG,PATHLR
	 JRST	P$IBAD		; PUT -- SECOND ARGUMENT
	MOVEI	X1,76
	PBOUT
	SKIPN	FLAG20
	 JRST	.+5
	HRRZI	X1,-1
	RFMOD
	TRO	X2,004000
	SFMOD
	TLNE	FLAG,PATHLR
	 HRLZI	X1,160103	; OLD,MSG,CONFIRM,JFN,SHORT
	TLNE	FLAG,PATHRL
	 HRLZI	X1,660043	; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
	MOVE	X2,[100,,101]
	GTJFN
	 SETZ	X1,
	MOVE	X4,X1
	SKIPN	FLAG20
	 JRST	.+5
	HRRZI	X1,-1
	RFMOD
	TRZ	X2,006000
	SFMOD
	JUMPE	X4,P$IENR
	MOVEI	X1,100
	BKJFN
	 THUD
	PBIN
	MOVEI	IO,(X1)
	HRRZI	X1,(X4)
	DVCHR
	TLNN	X2,000777
	 JRST	P$IE$1
	HRROI	X1,[ASCIZ/ (Device must be disk.)
/]
	PSOUT
	HRRZI	X1,(X4)
	RLJFN
	 JRST	.+1
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IE$1:	JUMPN	R12,P$IE$2
	TLNE	FLAG,PATHRL
	 JRST	.+5
	CAIN	IO,33
	 JRST	P$IE$2
	CAIN	IO," "
	 JRST	P$IE$2
	HRROI	X1,UBUF2
	HRRZI	X2,(X4)
	MOVE	X3,[002200,,000001]
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	.+2
	JRST	P$IE$2
	HRROI	X1,[ASCIZ/ (Bad remote file name.)
/]
	PSOUT
	HRRZI	X1,(X4)
	RLJFN
	 JRST	.+1
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IE$2:	MOVE	X1,X4
	MOVEM	X1,LJFN
	HRROI	X1,LFILE
	MOVE	X2,LJFN
	SETZ	X3,
	JFNS
	HLRO	X1,R11
	MOVE	X2,LJFN
	MOVE	X3,[002200,,000001]
	JFNS
	LDB	X2,X1
	CAIE	X2,"."
	 JRST	P$IE$3
	SETZ	X2,
	DPB	X2,X1
P$IE$3:	HRROI	X1,FSBUF
	MOVE	X2,LJFN
	HRLZI	X3,002000
	JFNS
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRROI	X1,ESBUF
	HRLZI	X3,000200
	JFNS
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	TLNN	X2,017000
	 JRST	P$IE$4
	TLNE	X2,010000
	 SETOM	VSBUF
	TLNE	X2,007000
	 SETZM	VSBUF
	JRST	P$IE$5
P$IE$4:	HRROI	X1,UBUF1
	HRLZI	X3,000020
	JFNS
	HRROI	X1,UBUF1
	MOVEI	X3,↑D10
	NIN
	 SETZ	X2,
	MOVEM	X2,VSBUF
P$IE$5:	HRRZ	X1,LJFN
	RLJFN
	 THUD
	MOVEI	UTIL,-1(R11)
	CAIN	IO,12
	 SETOM	LJFN
	CAIN	IO,37
	 SETOM	LJFN
	RETURN	SKIP,1
P$IE$6:	JUMPE	R12,.+3
	TLNE	FLAG,PATHLR
	 JRST	.+3
	SETZM	LFILE
	SETZM	LJFN
>
; (((↑↑↑)))
	JUMPN	UTIL,P$IENN
	TLNN	FLAG,PATHAS
	 JRST	P$IENC
	MOVE	R12,[POINT 7,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
	JRST	P$IENS
P$IENC:	TLNN	FLAG,PATHAD
	 JRST	P$IBAD
	MOVE	R12,[POINT 7,[ASCIZ/<</]]
	TLNE	FLAG,PATHCC
	 HRRI	R12,[ASCIZ/</]
	JRST	P$IENS
P$IENN:	TLNN	FLAG,PATHAS
	 JRST	P$IENZ
	TRNE	R10,P$I$EP!P$I$VP
	 JRST	P$IENZ
	TLNN	FLAG,PATHFR
	 JRST	.+3
	TRNN	R10,P$I$AE!P$I$DE
	 JRST	P$IENZ
	CAIN	IO,12
	 JRST	P$IENZ
	CAIN	IO,37
	 JRST	P$IENZ
	LDB	R13,BP
	CAIN	R13,"<"
	 JRST	P$IENT
	MOVEI	R13,">"
	IDPB	R13,BP
	TBOUT	<R13>
	ADDI	UTIL,1
P$IENT:	MOVE	R12,[POINT 7,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
P$IENS:	ILDB	R13,R12
	IDPB	R13,BP
	JUMPE	R13,RETN(1)
	TBOUT	<R13>
	AOJA	UTIL,P$IENS
P$IENZ:	SETZ	R13,
	IDPB	R13,BP
	ENDR	SKIP,1

; P$PP -- PROCESS PATH (NODES AND FILES)
;   IN: IO -- SOURCE,,NODE DESTINATION
;	UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
;	FLAG -- PATH CONTEXT FLAGS
;   OUT: FLAG -- FOUND FLAGS
;	 UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP:	BEGINR	<BP>
	TLNE	FLAG,PATHNR
	 JRST	P$PN
	HLR	BP,IO
	HRLI	BP,(POINT 7,)
	TLNN	FLAG,PATHNP
	 JRST	P$PF0
	SETZM	(IO)
	MOVE	X1,BP
	MOVE	X2,BP
P$PS1:	ILDB	X3,BP
	CAIN	X3,"<"
	 JRST	P$PS2
	CAIN	X3,">"
	 JRST	P$PS2
	CAIN	X3,"."
	 JRST	P$PS3
	CAIN	X3,";"
	 JRST	P$PS3
	JUMPE	X3,P$PS3
	JRST	P$PS1
P$PS2:	MOVE	X2,BP
	JRST	P$PS1
P$PS3:	MOVE	BP,X2
	CAMN	BP,X1
	 JRST	P$PF
	TLO	FLAG,PATHNF
	MOVE	X1,BP
	LDB	X2,X1
	CAIN	X2,"<"
	 ILDB	X2,X1
	SETZ	X3,
	DPB	X3,X1
	PUSH	STAK,X1
	PUSH	STAK,X2
	CALLR	P$CP
	POP	STAK,X2
	POP	STAK,X1
	DPB	X2,X1
	JRST	P$PF
P$PN:	TLO	FLAG,PATHNF
	CALLR	P$CP
	RETURN
P$PF:	SKIPE	(IO)
	 JRST	P$PF0
	MOVE	X1,[POINT 7,CONTEX]
	MOVE	X2,[POINT 7,NBUF]
	SCOPY	(X1,X2)
P$PF0:	TLO	FLAG,PATHFF
	SETZM	(UTIL)
	HLR	X1,UTIL
	HRLI	X1,(POINT 7,)
P$PF1:	ILDB	X2,BP
; (((TENEX)))
IFG F.TENX,<
	CAIE	X2,"V"-100
	 JRST	.+4
	ILDB	X2,BP
	IDPB	X2,X1
	JRST	P$PF1
>
; (((↑↑↑)))
	IDPB	X2,X1
	JUMPE	X2,P$PF3
	CAIN	X2,";"
	 JRST	P$PF4
	CAIE	X2,"."
	 JRST	P$PF1
	SETZ	X2,
	DPB	X2,X1
	HRRI	X1,(UTIL)
	HRLI	X1,(POINT 7,)
P$PF2:	ILDB	X2,BP
; (((TENEX)))
IFG F.TENX,<
	CAIE	X2,"V"-100
	 JRST	.+4
	ILDB	X2,BP
	IDPB	X2,X1
	JRST	P$PF2
>
; (((↑↑↑)))
	IDPB	X2,X1
	CAIN	X2,";"
	 JRST	P$PF4
	JUMPN	X2,P$PF2
P$PF3:	SETZ	UTIL,
	RETURN
P$PF4:	SETZ	X2,
	DPB	X2,X1
	ILDB	X2,BP
	CAIE	X2,"*"
	 JRST	P$PF5
	SETO	UTIL,
	RETURN
P$PF5:	SETZ	UTIL,
P$PF6:	SUBI	X2,"0"
	IMULI	UTIL,↑D10
	ADDI	UTIL,(X2)
	ILDB	X2,BP
	JUMPN	X2,P$PF6
	ENDR

; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IO -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IO,FLAG>
	MOVEI	X1,<<LBSIZE*5>-1>
	HLR	X2,IO
	HRLI	X2,350700
	HRRI	X3,(IO)
	HRLI	X3,(POINT 7,)
	LDB	IO,X2
	CAIN	IO,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCC
	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCA
	ILDB	IO,X2
P$CPCT:	MOVE	X4,[POINT 7,[ASCIZ/%TOP./]]
	SCOPY	(X4,X3)
	MOVE	X4,[POINT 7,ANCHOR]
	SCOPY	(X4,X3)
	SUBI	X1,11
	JRST	P$CPCE
P$CPCA:	MOVE	X4,[POINT 7,[ASCIZ/%LOGIN/]]
	SCOPY	(X4,X3)
	SUBI	X1,6
	JRST	P$CPCE
P$CPCC:	MOVE	X4,[POINT 7,CONTEX]
	ILDB	0,X4
	JUMPE	0,.+4
	SOJL	X1,P$CPE
	IDPB	0,X3
	JRST	.-4
	MOVE	X4,X3
	IDPB	0,X4
P$CPCE:	JUMPE	IO,P$CPZ0
	MOVEI	X4,"."
	IDPB	X4,X3
	SUBI	X1,1
	MOVEI	X4,42
	SETZ	FLAG,
	JRST	P$CPI0
P$CPI:	ILDB	IO,X2
P$CPI0:	CAIN	IO,"P"-100
	 JRST	P$CPI
	CAIN	IO,">"
	 JRST	P$CPS
	JUMPE	IO,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IO,":"
	 JRST	P$CPP
	CAIN	IO,"*"
	 JRST	P$CPO
	CAIGE	IO,"A"
	 JRST	P$CPQ
	CAILE	IO,"Z"
	 JRST	P$CPQ
P$CPO:	SOJL	X1,P$CPE
	IDPB	IO,X3
	JRST	P$CPI
P$CPQ:	SOJL	X1,P$CPE
	IDPB	X4,X3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IO,"'"
	IDPB	IO,X3
	MOVEI	IO,")"
	IDPB	IO,R3
	SETZ	FLAG,
	MOVEI	IO,"."
	JRST	P$CPO
P$CPP:	SUBI	X1,4
	JUMPL	X1,P$CPE
	MOVEI	IO,"("
	IDPB	IO,R3
	MOVEI	IO,"'"
	IDPB	IO,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,.+5
	MOVEI	X1,"'"
	IDPB	X1,X3
	MOVEI	X1,")"
	IDPB	X1,X3
P$CPZ0:	IDPB	IO,X3
	ENDR

; LOCAL FILE NAME PREPARATION
;   IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF:	BEGINR	<IO>
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LFILE
	 RETURN
>
; (((↑↑↑)))
	HLL	X1,IO
	HRRI	X1,FSBUF
	BLT	X1,<FSBUF+SBSIZE-1>
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRLI	X1,(IO)
	HRRI	X1,ESBUF
	BLT	X1,<ESBUF+SBSIZE-1>
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	HLR	X1,IO
	HRLI	X1,(POINT 7,)
	MOVE	X2,[POINT 7,ABUF]
	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,.-2
	SKIPN	(IO)
	 JRST	.+8
	MOVEI	X3,"."
	DPB	X3,X2
	HRRI	X1,(IO)
	HRLI	X1,(POINT 7,)
	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,.-2
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	HRRZI	IO,ABUF
	CALLR	LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	MOVEM	UTIL,VSBUF
	JUMPE	UTIL,P$LFX1
	SKIPN	FLAG20
	 MOVEI	X3,";"
	SKIPE	FLAG20
	 MOVEI	X3,"."
	DPB	X3,X2
	JUMPG	UTIL,P$LFX0
	MOVEI	X3,"*"
	IDPB	X3,X2
	SETZ	X3,
	IDPB	X3,X2
	JRST	P$LFX1
P$LFX0:	MOVE	X1,X2
	MOVE	X2,UTIL
	MOVEI	X3,↑D10
	NOUT
	 THUD
P$LFX1:	MOVE	IO,[ABUF,,LFILE]
	BLT	IO,<LFILE+SBSIZE-1>
>
; (((↑↑↑)))
	ENDR

; ***DATACOMPUTER INTERFACE ROUTINES***

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ/LOGIN /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	SKIPN	OPENED
	 RETURN
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR	<IO,UTIL>
	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCHAD:	DCSOUT	<[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	DCHAD
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DCHAI:	TAIN	<[ASCIZ/ Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM	ABUF		; WRITE FLAG
	SETZM	<ABUF+1>	; HOST
	SETZM	<ABUF+2>	; SOCKET
	SETOM	<ABUF+3>	; PASSWORD
	TAIN	<[ASCIZ/  Allow control? /]>
	 JRST	DCHAI
	 SETOM	ABUF
	TAIN	<[ASCIZ/  Restrict via network? /]>
	 JRST	DCHAI
	 JRST	DCHAI5
	TAIN	<[ASCIZ/   Restrict via local host? /]>
	 JRST	DCHAI
	 JRST	DCHAI1
	MOVE	IO,LHOST
	JRST	DCHAI2
DCHAI1:	TSOUT	<[ASCIZ/    Host number (octal): /]>
	TNIN	([ASCIZ/    Host number (octal): /],10)
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAI2:	MOVEM	IO,<ABUF+1>
	TAIN	<[ASCIZ/   Restrict via user? /]>
	 JRST	DCHAI
	 JRST	DCHAI5
	MOVE	IO,LHOST
	CAMN	IO,<ABUF+1>
	 JRST	DCHAI3
	TSOUT	<[ASCIZ/    Socket number (octal): /]>
	TNIN	([ASCIZ/    Socket number (octal): /],10)
	 JRST	DCHAI
	JRST	DCHAI4
DCHAI3:
; (((NOT ITS)))
IFGE F.TENX,<
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)
IFE F.SAIL,<
	TSOUT	<[ASCIZ/    User: /]>
	TNIN	([ASCIZ/    User: /],10)
	 JRST	DCHAI
	LSH	IO,11
	ADDI	IO,100
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	TSOUT	<[ASCIZ/    User: /]>
	TSIN	(UBUF1,LBSIZE,[ASCIZ/    User: /])
	 JRST	DCHAI
	SETZ	X1,
	MOVE	X2,[POINT 7,UBUF1]
	STDIR
	 JRST	.+3
	 JRST	.+2
	JRST	.+4
	HRROI	X1,[ASCIZ/ (User not found)
/]
	PSOUT
	JRST	DCHAI
	HRRZI	IO,(X1)
	LSH	IO,↑D15
	ADDI	IO,20
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<SETZM ABUF+2
	JRST DCHAI5>
IFN F.SAIL,<SETZM <ABUF+2>
	JRST DCHAI5>
DCHAI4:	MOVEM	IO,<ABUF+2>
	TSOUT	<CRLF>
DCHAI5:	TAIN	<[ASCIZ/  Restrict via password? /]>
	 JRST	DCHAI
	 JRST	DCHAC
	TSOUT	<[ASCIZ/   Password: /]>
	TSIN	(<ABUF+3>,<SBSIZE-3>,[ASCIZ/   Password: /])
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAC:	DCSOUT	<[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
	SKIPE	ABUF
	 JRST	DCHAC1
	DCSOUT	<[ASCIZ/CWA/]>
DCHAC1:	SKIPN	<ABUF+1>
	 JRST	DCHAC3
	DCSOUT	<<[ASCIZ/,H=/]>>
	MOVE	IO,<ABUF+1>
	DCNOUT	<IO>
	DCSOUT	<<[ASCIZ/,S=/]>>
	MOVE	IO,<ABUF+2>
	JUMPE	IO,DCHAC2
	DCNOUT	<IO>
	JRST	DCHAC3
DCHAC2:	DCSOUT	<[ASCIZ/ANY/]>
DCHAC3:	SETO	IO,
	CAMN	IO,<ABUF+3>
	 JRST	DCHAC4
	DCSOUT	<<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4:	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	TSOUT	<[ASCIZ/  [OK]/],CRLF>
	JRST	DCHAI
	ENDR

; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DCON2
DCON1:	TAIN	<[ASCIZ/ [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	X1,[POINT 7,NBUF]
	MOVE	X2,[POINT 7,CONTEX]
	SCOPY	(X1,X2)
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
	MOVEI	IO,DEFALO
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR

; DDEL -- DELETE FILES
;
DDEL:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE DELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS='D'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		DELETED=DELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR

; DDIR -- FILE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPN	VBUF
	 SETOM	VBUF
	SETZ	UTIL,
	CAIN	FLAG,DD$D
	 JRST	DDIRO1
	CAIN	FLAG,DD$T
	 JRST	DDIRO2
	CAIN	FLAG,DD$V
	 JRST	DDIRO3
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	JRST	DDIRO4
DDIRO2:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	JRST	DDIRO4
DDIRO3:	DCSOUT	<[ASCIZ/"<VERBOSE">="<FILES">/]>
	SETZ	IO,
DDIRO4:	CALLR	D$WITH
	DCSOUT	<SEMI>
	MOVE	IO,[ASCII/.I241/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRF:	CALLR	RENPRE
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRF:	SKIPN	FLAGCO
	 JRST	DDIRF0
	HRROI	X1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	X1,DCOJFN
	MOVEI	X2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF0:	CALLR	RENPRE
>
; (((↑↑↑)))
	CAMN	IO,[ASCII/     /]
	 JRST	DDIRF1
	CAMN	IO,[ASCII/.I261/]
	 JRST	DDIRF2
	CALLR	RENLIP
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF1:	CALLR	<(FLAG)>
	AOJA	UTIL,DDIRF
DDIRF2:	CALLR	RENLIN
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	UTIL,RETN(0)
	TSOUT	<[ASCIZ/ [No Files]/],CRLF>
	ENDR

; DD$D -- DELETED FILES
;
DD$D:	BEGINR
	CALLR	DD$T
	ENDR

; DD$T -- TERSE FILES
;
DD$T:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T1
	MOVEI	IO,11
	TBOUT	<IO>
DD$T1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T2
	TBOUT	<IO>
DD$T2:	CAIE	IO,12
	 JRST	DD$T1
	ENDR

; DD$V -- VERBOSE FILES
;
DD$V:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V1
	MOVEI	IO,11
	TBOUT	<IO>
DD$V1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V3
	CAIN	IO,11
	 JRST	DD$V2
	TBOUT	<IO>
	JRST	DD$V3
DD$V2:	TSOUT	<CRLF>
	TBOUT	<IO>
	TBOUT	<IO>
	JRST	DD$V1
DD$V3:	CAIE	IO,12
	 JRST	DD$V1
	ENDR

; DEXP -- EXPUNGE
;
DEXP:	BEGINR	<IO>
	SKIPN	OPENED
	 JRST	DEXP1
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DEXP1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IO,[ASCII/.I280/]
	 JRST	DEXP2
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
DEXP2:	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CAIE	IO,12
	 JRST	DEXP2
	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CALLR	RENLIN
	RETURN
DEXP3:	DCBIN	<IO>
	CAIE	IO,"R"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"E"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"C"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"S"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DEXP2
	CALLR	DCNIN
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	JUMPN	IO,DEXP4
	DCSOUT	<[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DEXP4:	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	DCSOUT	<[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/CLOSE "<">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
	ENDR

; DGET -- GET-RETRIEVE
;
DGET:	BEGINR	<IO,FLAG>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DGET1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DGET2
DGET1:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE EXTANT INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	EXTANT=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (VERSION EQ /]>
	MOVE	IO,VBUF
	DCNOUT	<IO>
	DCSOUT	<[ASCIZ/)
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		AND (STATUS EQ ' ')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			EXTANT=EXTANT+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
DGET2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DGET$
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DGET$:	SETZM	NSUM
DGET3:	CALLR	GETFIL
	 JRST	DGET4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	CALLR	LOCNFO
	SETZM	FLAGFE
	CALLR	LOCOO
	 SETOM	FLAGFE
	CALLR	GETDAT
	CALLR	LOCC
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DGET3
DGET4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DGETE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DGETE:	CALLR	D$CON
	ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
	GET$F==SBSIZE		; FILENAME
	GET$E==SBSIZE		; EXTENSION
	GET$D==4		; DATE

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IO,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLINE
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ/[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR

; DLIS -- NODE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	CAIN	FLAG,DL$T
	 JRST	DLISO1
	CAIN	FLAG,DL$V
	 JRST	DLISO2
	CAIN	FLAG,DL$P
	 JRST	DLISO3
	RETURN
DLISO1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
	JRST	DLISI
DLISO2:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
	JRST	DLISI
DLISO3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI:	SETZ	UTIL,
	SETZM	GBUF1
	MOVE	X1,[GBUF1,,GBUF1+1]
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVEI	X1,<GBUF2+1>
	MOVEM	X1,GBUF2
	CALLR	RENPRE
	CAMN	IO,[ASCII/.I280/]
	 JRST	DLISD
	CALLR	RENLIP
	JRST	DLISER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DLISN:	DCBIN	<IO>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DLISN:	SKIPN	FLAGCO
	 JRST	DLISN0
	HRROI	X1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	X1,DCOJFN
	MOVEI	X2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	JRST	DLISER
DLISN0:	DCBIN	<IO>
>
; (((↑↑↑)))
	CAIE	IO," "
	 JRST	DLISE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DLISD
	CALLR	<(FLAG)>
	JRST	DLISN
DLISD:	CALLR	RENLIN
	JRST	DLISN
DLISE:	CAIN	IO,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JUMPN	UTIL,DLISER
	TSOUT	<[ASCIZ/ [No Nodes]/],CRLF>
DLISER:	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DL$T -- TERSE NODES
;
DL$T:	BEGINR
	CALLR	DL$NAM
	 JRST	DL$T0
	TSOUT	<CRLF>
DL$T0:	CALLR	RENLIN
	ENDR

; DL$V -- VERBOSE NODES
;
DL$V:	BEGINR	<IO,UTIL,FLAG>
DL$VN:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VN
	CALLR	DL$NAM
	 JRST	DL$VE
	TSOUT	<CRLF>
	MOVEI	UTIL,GBUF1
	SKIPE	(UTIL)
	 AOJA	UTIL,.-1
	SUBI	UTIL,GBUF1
DL$VF:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VF
	DCBIN	<IO>
	SETZ	FLAG,
	CAIN	IO,"F"
	 MOVEI	FLAG,5
	CAIN	IO,"P"
	 MOVEI	FLAG,1
	CAIN	IO,"N"
	 MOVEI	FLAG,3
	JUMPE	FLAG,DL$VE
	CALLR	RENLIN
DL$VD:	MOVEI	IO,(UTIL)
DL$VD0:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$VD0
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$VD1:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$VD1
	SOJG	FLAG,DL$VD
	RETURN
DL$VE:	CALLR	RENLIN
	ENDR

; DL$P -- PROTECTION
;
DL$P:	BEGINR	<IO>
	CALLR	DL$NAM
	 JRST	DL$P1
	TSOUT	<CRLF>
	CALLR	RENLIN
	RETURN
DL$P1:	MOVEI	IO,GBUF1
DL$P2:	SKIPE	(IO)
	 AOJA	IO,DL$P2
	SUBI	IO,GBUF1
DL$P3:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$P3
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$P4:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$P4
	ENDR

; DL$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM:	BEGINR	<BP,UTIL,FLAG,R10>
	SETZ	R10,
	SETZ	FLAG,
	MOVE	BP,[POINT 7,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
	DCBIN	<IO>
	CAILE	IO," "
	 JRST	DL$NA1
	RETURN
DL$NAN:	DCBIN	<IO>
DL$NA1:	CAIN	IO,"."
	 JRST	DL$NIN
	CAIG	IO," "
	 JRST	DL$NA3
	CAIE	IO,42
	 JRST	DL$NA2
	DCBIN	<IO>
DL$NA2:	IDPB	IO,BP
	SOJG	UTIL,DL$NAN
	JRST	DL$NER
DL$NA3:	SETZ	X1,
	IDPB	X1,BP
	TSOUT	<[ASCIZ/  /],ABUF>
	RETURN	SKIP,1
DL$NIN:	MOVE	BP,[POINT 7,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
DL$NI1:	DCBIN	<IO>
	CAIN	IO,"."
	 JRST	DL$NCN
	CAIG	IO," "
	 JRST	DL$NCN
DL$NI2:	CAIE	IO,42
	 JRST	DL$NI3
	DCBIN	<IO>
DL$NI3:	IDPB	IO,BP
	SOJG	UTIL,DL$NI1
	JRST	DL$NER
DL$NCN:	SETZ	X1,
	IDPB	X1,BP
	SKIPN	X2,GBUF1(FLAG)
	 JRST	DL$NON
	HRLI	X2,(POINT 7,)
	MOVE	X1,[POINT 7,ABUF]
DL$NC1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DL$NON
	JUMPN	X3,DL$NC1
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NON:	CAIL	FLAG,LBSIZE-2
	 JRST	DL$NER
	SETZM	GBUF1+1(FLAG)
	HRL	X1,GBUF1+1(FLAG)
	HRR	X1,GBUF1+2(FLAG)
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVE	X1,[POINT 7,ABUF]
	SKIPN	X2,GBUF1(FLAG)
	 HRR	X2,GBUF2
	HRLI	X2,(POINT 7,)
	HRRZI	BP,(BP)
	SUBI	BP,<ABUF-1>
	ADDI	BP,(X2)
	CAIL	BP,<GBUF2+LBSIZE>
	 JRST	DL$NER
	HRRZM	X2,GBUF1(FLAG)
DL$NO1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,DL$NO1
	HRRZI	X2,1(X2)
	MOVEM	X2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DL$NO2
	TSOUT	<CRLF>
DL$NO2:	TSOUT	<[ASCIZ/    /]>
	SOJGE	UTIL,DL$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NER:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	ENDR

; DPUT -- PUT-STORE
;
DPUT:	BEGINR	<IO>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	CALLR	LOCFFI
	 RETURN
	SKIPN	OPENED
	 JRST	DPUT3
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
DPUT1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DPUT2
	JUMPN	X3,DPUT1
	MOVEI	X1,1
	CAMN	X1,OPENEM
	 JRST	DPUT5
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT2:	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DPUT3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DPUT4
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT4:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGNN
	 JRST	DPUT$1
	TSOUT	<[ASCIZ/ [New <FILES>]/],CRLF>
DPUT$1:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	SETZM	VBUF
	JRST	DPUT6
DPUT5:	SETZM	VBUF
	SETZ	IO,
	CALLR	D$VER
	 RETURN
DPUT6:	AOS	VBUF
	DCSOUT	<[ASCIZ/"<FILES">="<PUT">/],SEMI>
	CALLR	NETOO
	 THUD
	MOVE	IO,[ASCII/;I239/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DPUT$2
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DPUT$2:	SETZM	NSUM
	CALLR	LOCOI
	 THUD
	CALLR	NETFFI
DPUT7:	CALLR	PUTFIL
	CALLR	PUTDAT
	SKIPE	FLAGTT
	 CALLR	NETRAT
	CALLR	LOCNFI
	 JRST	DPUT7
	CALLR	NETC
	MOVE	IO,[ASCII/;I259/]
	CALLR	RENFIP
	 JRST	DPUTE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN	SKIP,1
DPUTE:	CALLR	D$CON
	ENDR

; DREM -- DELETE NODES
;
DREM:	BEGINR
	SKIPN	OPENED
	 JRST	DREM0
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
DREM0:	DCSOUT	<[ASCIZ/DELETE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/LIST /],CONTEX,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	RETURN
	TSOUT	<[ASCIZ/ [Connected To Attached Node]/],CRLF>
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	ENDR

; DREN -- RENUMBER FILES
;
DREN:	BEGINR	<IO,UTIL>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	MOVE	UTIL,VBUF
	MOVE	IO,ABUF
	MOVEM	IO,VBUF
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE SAMEVERSION INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ SAMEVERSION=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ FOR FILES IN "<FILES">/]>
	SETZ	IO,
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  SAMEVERSION=SAMEVERSION+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF SAMEVERSION NE 0 THEN ERROR 'VERSION ALREADY EXISTS'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	MOVEM	UTIL,VBUF
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE RENUMBERED INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ RENUMBERED=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  COMMENT FILES.FILE.HEADER.FILENAME/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/   ! '.' ! FILES.FILE.HEADER.EXTENSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/    ! ';' ! FILES.FILE.HEADER.VERSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  VERSION=/]>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  RENUMBERED=RENUMBERED+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ END/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF RENUMBERED EQ 0 THEN ERROR 'NO SUCH FILE'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR

; DUND -- UNDELETE
;
DUND:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	MOVEI	IO,"D"
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE UNDELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UNDELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS=' '
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		UNDELETED=UNDELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR

; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IO,BP,UTIL,FLAG>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$IN0
	TSOUT	<[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
	HRRZI	UTIL,HOSTS
D$IN1:	SKIPN	(UTIL)
	 JRST	D$IND
	HLRZ	X1,(UTIL)
	CAME	X1,LHOST
	 AOJA	UTIL,D$IN1
	MOVE	IO,[POINT 7,[ASCIZ/%TOP.DFTP./]]
	MOVE	BP,[POINT 7,ABUF]
	SCOPY	(IO,BP)
	HRR	IO,(UTIL)
	HRLI	IO,(POINT 7,)
	SCOPY	(IO,BP)
	MOVEI	IO,"."
	IDPB	IO,BP
; (((ITS)))
IFL F.TENX,<
	.SUSET [.RXUNAME,,UBUF1]
	SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
	HRROI X1,31
	HRROI X2,32
	GETTAB	X1,
	 THUD
	GETTAB	X2,
	 THUD
	MOVEM	X1,UBUF1
	MOVEM	X2,<UBUF1+1>
	SETZM	<UBUF1+2>
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
	GETPPN X1,
	 JFCL
	TRNN X1,770000
	 JRST [	LSH X1,↑D6
		JRST .-1]		; Left Justify SAIL PN's
	HRLZM X1,UBUF1
	SETZM UBUF1+1
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((ITS+TOPS-10)
IFLE F.TENX,<
	MOVE	X1,[POINT 6,UBUF1]
	MOVEI	X2,42
	ILDB	X3,X1
	JUMPE	X3,.+7
	ADDI	X3,40
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	.-7
	MOVE	X1,BP
	IDPB	X3,X1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAMN	X1,X2
	 JRST	.+10
	HRROI	X1,[ASCIZ/  (from /]
	PSOUT
	MOVEI	X1,101
	DIRST
	 THUD
	HRROI	X1,[ASCIZ/)
/]
	PSOUT
	HRROI	X1,UBUF1
	DIRST
	 THUD
	MOVE	X1,[POINT 7,UBUF1]
	MOVEI	X2,42
	ILDB	X3,X1
	JUMPE	X3,.+6
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	.-6
	MOVE	X1,BP
	IDPB	X3,X1
>
; (((↑↑↑)))
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	CAMN	IO,[ASCII/;O032/]
	 JRST	D$INP
	CAME	IO,[ASCII/+U107/]
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ/  [Password:/]>
	TSIN	(UBUF1,LBSIZE,<[ASCIZ/  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ/]/],CRLF>
	MOVE	X2,BP
	MOVEI	X1,"("
	IDPB	X1,X2
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVE	X1,[440700,,UBUF1]
	SCOPY	(X1,X2)
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVEI	X1,")"
	IDPB	X1,X2
	SETZ	X1,
	IDPB	X1,X2
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	TSOUT	<[ASCIZ/   (Incorrect password)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
D$IND:	MOVE	X1,[POINT 7,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
	MOVE	X2,[POINT 7,ABUF]
	SCOPY	(X1,X2)
	DCSOUT	<[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ/  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<TERSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	UTIL,[ASCII/%LOGI/]
	MOVEM	UTIL,CONTEX
	MOVE	UTIL,[ASCII/N/]
	MOVEM	UTIL,<CONTEX+1>
	SETZM	OPENED
	CALLR	D$CON
	ENDR

; D$CON -- CONNECT
;
D$CON:	BEGINR	<UTIL>
	CALLR	NETDSI
	DCSOUT	<[ASCIZ/CONNECT "<GET"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	CALLR	NETDSO
	DCSOUT	<[ASCIZ/CONNECT "<PUT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
; (((TENEX)))
IFG F.TENX,<
	GJINF
	MOVEM	X2,LDIR
>
; (((↑↑↑)))
	ENDR

; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
;   IN: IO -- MODE FLAG
;			READ IF < 0
;			WRITE IF = 0
;			APPEND IF > 0
;
D$OPEN:	BEGINR
	SKIPN	OPENED
	 JRST	D$OP05
	MOVE	X1,[POINT 7,OPENED]
	MOVE	X2,[POINT 7,NBUF]
D$OP01:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	D$OP05
	JUMPN	X3,D$OP01
	CAMN	IO,OPENEM
	 RETURN	SKIP,1
	JUMPE	IO,D$OP02
	JUMPG	IO,D$OP03
	DCSOUT	<[ASCIZ/MODE "<FILES"> READ/],SEMI>
	JRST	D$OP04
D$OP02:	DCSOUT	<[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
	JRST	D$OP04
D$OP03:	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEM	IO,OPENEM
	RETURN	SKIP,1
D$OP05:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$OP06
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
D$OP06:	SKIPN	OPENED
	 JRST	D$OP07
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
D$OP07:	JUMPE	IO,D$OP08
	JUMPG	IO,D$OP09
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
	JRST	D$OP10
D$OP08:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
	JRST	D$OP10
D$OP09:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[POINT 7,NBUF]
	MOVE	X2,[POINT 7,OPENED]
	SCOPY	(X1,X2)
	MOVEM	IO,OPENEM
	ENDR	SKIP,1

; D$VER -- PRODUCE PROPER VERSION NUMBER
;   IN: IO -- DEFAULT FLAG
;			SMALLEST UNDELETED VERSION IF < 0
;			LARGEST VERSION IF = 0
;			LARGEST DELETED VERSION IF = "D"
;			LARGEST UNDELETED VERSION IF = " "
;   OUT: IO -- VERSION (IF DEFAULT)
;
D$VER:	BEGINR	<UTIL>
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPE	IO,D$VER1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPG	IO,D$VER2
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE LEAST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	LEAST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ ' ')/],[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF LEAST EQ -1 THEN LEAST=VERSION ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			IF LEAST GT VERSION THEN LEAST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! LEAST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER1:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">/]>
	CALLR	D$WITH
	DCSOUT	<[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER2:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ '/]>
	DCBOUT	<IO>
	SKIPN	FLAGDD
	 JRST	D$VER$
	TBOUT	<IO>
D$VER$:	DCSOUT	<[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
D$VERE:	MOVE	IO,[ASCII/;A282/]
	CALLR	RENFIP
	 RETURN
D$VERN:	DCBIN	<IO>
	CAIE	IO,"}"
	 JRST	D$VERN
	CALLR	DCNIN
	MOVEM	IO,VBUF
	CALLR	RENLIN
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1

; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
;   IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
;   FLAGS:
	D$W$F==400000
	D$W$E==200000
	D$W$V==100000
	D$W$Q==010000
;
D$WITH:	BEGINR	<UTIL,FLAG>
	SETZ	FLAG,
	LDB	UTIL,[350700,,FBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$F
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$E
	SKIPLE	VBUF
	 TRO	FLAG,D$W$V
	SKIPE	IO
	 TRO	FLAG,D$W$Q
	JUMPE	FLAG,RETN(0)
	DCSOUT	<[ASCIZ/ WITH/]>
	TRNN	FLAG,D$W$F
	 JRST	D$WIT1
	DCSOUT	<[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$E!D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT1:	TRNN	FLAG,D$W$E
	 JRST	D$WIT2
	DCSOUT	<[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT2:	TRNN	FLAG,D$W$V
	 JRST	D$WIT3
	DCSOUT	<[ASCIZ/ VERSION EQ /]>
	MOVE	UTIL,VBUF
	DCNOUT	<UTIL>
	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT3:	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<(IO)>
	ENDR

; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM:	BEGINR	<IO,FLAG>
	CALLR	RENPRE
	CAME	IO,[ASCII/;I275/]
	 JRST	NETS2
	SETZ	FLAG,
NETS1:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	NETS1
	SKIPN	FLAG
	 SOJA	FLAG,NETS1
	CALLR	DCNIN
	CAME	IO,NSUM
	 JRST	NETS3
	CALLR	RENLIN
	RETURN
NETS2:	CALLR	RENLIP
	RETURN
NETS3:	CALLR	RENLIN
	TSOUT	<[ASCIZ/ (Network Checksum Error)/],CRLF>
	ENDR

; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT:	BEGINR	<IO,<IO+1>>
	TSOUT	<[ASCIZ/ (/]>
	MOVEI	IO,↑D36
	IMULB	IO,NSIZE
	IDIV	IO,NTIME
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ Baud (/]>
	MOVE	IO,NSIZE
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ bits in /]>
	MOVE	IO,NTIME
	CAIN	IO,0
	 MOVEI	IO,1
	TNOUT	<IO>
	HRRZI	<IO+1>,[ASCIZ/ seconds))/]
	CAIN	IO,1
	 HRRZI	<IO+1>,[ASCIZ/ second))/]
	TSOUT	<(IO+1),CRLF>
	ENDR

; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IO,UTIL,FLAG>
	SETZ	FLAG,
RENDSL:	CALLR	RENPRE
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENDES
	CAMN	IO,[ASCII/.I210/]
	 JRST	RENDRR
	CAMN	IO,[ASCII/;A282/]
	 JRST	RENDPM
	CAMN	IO,[ASCII/.J151/]
	 JRST	RENDPM
	LDB	UTIL,[350700,,IO]
	CAIN	UTIL,"+"
	 JRST	RENDMM
	CAIN	UTIL,"-"
	 JRST	RENDMM
	JRST	RENDFL
RENDMM:	SETO	FLAG,
	SKIPN	FLAGDE
	 JRST	RENDFL
	SETZM	FLAGDE
RENDPM:	CALLR	RENLIP
	JRST	RENDSL
RENDFL:	CALLR	RENLIN
	JRST	RENDSL
RENDES:	CALLR	RENLIN
	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETO	FLAG,
	JRST	RENDSL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
;   IN: IO -- PREFIX
;
RENFIP:	BEGINR	<BP,UTIL,FLAG>
	MOVE	FLAG,IO
	SETZ	UTIL,
RENFIL:	CALLR	RENPRE
	CAMN	IO,FLAG
	 RETURN	SKIP,1
	LDB	BP,[350700,,IO]
	CAIN	BP,";"
	 JRST	RENFIN
	CAIN	BP,"."
	 JRST	RENFIN
	SKIPN	UTIL
	 CALLR	RENLIP
	SKIPE	UTIL
	 CALLR	RENLIN
	AOJA	UTIL,RENFIL
RENFIN:	CALLR	RENLIN
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENFIS
	CAMN	IO,[ASCII/.I210/]
	 RETURN
	JRST	RENFIL
RENFIS:	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IO>
RENLNL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IO>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IO>
	CAIN	IO,12
	 RETURN
	CAIE	IO,11
	 JRST	RENLPF
	MOVEI	IO," "
	TBOUT	<IO>
	MOVEI	IO,"("
RENLPP:	TBOUT	<IO>
RENLPQ:	DCBIN	<IO>
	CAIN	IO,42
	 JRST	RENLPQ
	CAIE	IO,15
	 JRST	RENLPP
	DCBIN	<IO>
	MOVEI	IO,")"
	TBOUT	<IO>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BP,UTIL,FLAG>
RENPRP:	SETZ	IO,
	MOVE	BP,[POINT 7,IO]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	RENPRL
	CAIN	UTIL,12
	 JRST	RENPRL
	IDPB	UTIL,BP
	SOJG	FLAG,RENPRL
	LDB	UTIL,[350700,,IO]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIE	UTIL,"!"
	 RETURN
	SKIPN	FLAGNN
	 CALLR	RENLIP
	JRST	RENPRP
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
	.VALUE
	.BREAK 16,160000
>
; (((TOPS-10)))
IFE F.TENX,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))

; ***I/O ROUTINES***

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IO>
	MOVEI	IO,(X1)
	TSOUT	<(IO)>
TAIN1:	TBIN	<IO>
	CAIN	IO,15
	 JRST	TAIN1
	CAIN	IO,"R"-100
	 JRST	TAIN1
	CAIN	IO,"N"
	 JRST	TAIN2
	CAIN	IO,"Y"
	 JRST	TAIN3
	CAIN	IO,12
	 JRST	TAIN4
	CAIN	IO,33
	 JRST	TAIN4
	CAIN	IO,37
	 JRST	TAIN4
	CAIN	IO," "
	 JRST	TAIN4
	TSOUT	<[ASCIZ/XXX/],CRLF>
	RETURN
TAIN2:	TSOUT	<[ASCIZ/No/],CRLF>
	RETURN	SKIP,1
TAIN3:	TSOUT	<[ASCIZ/Yes/]>
TAIN4:	TSOUT	<CRLF>
	ENDR	SKIP,2

; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[POINT 7,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIN	TCIO,"A"-100
	 JRST	TCIDEL
	CAIN	TCIO,"U"-100
	 JRST	TCIENR
	CAIN	TCIO,"X"-100
	 JRST	TCIENR
	CAIN	TCIO,177
	 JRST	TCIDEL
	CAIN	TCIO,15
	 JRST	TCICHR
	CAIN	TCIO,12
	 JRST	TCIC01
	CAIN	TCIO,37
	 JRST	TCIC01
	CAIN	TCIO," "
	 JRST	TCIC01
	CAIN	TCIO,33
	 JRST	TCIC01
	CAIG	TCIO," "
	 JRST	TCIBAD
	JRST	TCIC02
TCIC01:	JUMPE	TCISCC,TCIENN
	HLRZ	UTIL,TCIPLP(TCISCC)
	CAIN	UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST	TCIEND
TCIC02:	SETZ	TCIPCC,
	MOVE	TCIPBP,TCISBP
	MOVE	UTIL,TCIPNF
	MOVEM	UTIL,<TCIPLP+1>(TCISCC)
	SETZ	TCIMAC,
	HRRZI	TCIMAN,-1
TCIC03:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC04
	CAIE	UTIL,(TCIO)
	 JRST	TCIC08
TCIC04:	HLRZ	TCITCC,TCIPLP(TCISCC)
	HRRZ	TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE	UTIL,(TCITLP)
	CAIN	UTIL,(TCIPCC)
	 JRST	TCIC06
	AOJ	TCITLP,
	SOJG	TCITCC,TCIC05
	JRST	TCIC08
TCIC06:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC07
	AOJ	TCIMAC,
	MOVEM	TCIPCC,@TCIPNF
	AOS	TCIPNF
	JRST	TCIC08
TCIC07:	CAIN	TCIMAN,-1
	 SETO	TCIMAN,
	CAIE	TCIMAN,-1
	 HRRZI	TCIMAN,(TCIPCC)
TCIC08:	ADD	TCIPBP,3(TCIACB)
	AOJ	TCIPCC,
	CAME	TCIPCC,1(TCIACB)
	 JRST	TCIC03
	CAIN	TCIO,12
	 JRST	TCIC09
	CAIN	TCIO,37
	 JRST	TCIC09
	CAIN	TCIO," "
	 JRST	TCIC09
	CAIE	TCIO,33
	 JRST	TCIC10
TCIC09:	JUMPL	TCIMAN,TCIBAD
	CAIN	TCIMAN,-1
	 JRST	TCIBAD
	JRST	TCIEND
TCIC10:	JUMPE	TCIMAC,TCIBAD
	AOJ	TCISCC,
	HRLM	TCIMAC,TCIPLP(TCISCC)
	IBP	TCISBP
	IDPB	TCIO,TCIBP
	TBOUT	<TCIO>		; ECHO
	JRST	TCICHR
TCIBAD:	MOVEI	TCIO,"G"-100
	TBOUT	<TCIO>
	JRST	TCICHR
TCIREP:	TSOUT	<CRLF>
	HLRZ	UTIL,TCIACB
	TSOUT	<(UTIL)>
	HRRZI	TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE	TCIPBP,[POINT 7,ABUF]
TCIR01:	SOJL	TCIPCC,TCICHR
	ILDB	TCIO,TCIPBP
	TBOUT	<TCIO>
	JRST	TCIR01
TCIQUA:	TBOUT	<TCIO>		; PRINT "?"
	HLRZ	TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ	TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT	<CRLF>
	MOVEI	TCIO,11
	TBOUT	<TCIO>
	MOVE	TCITCC,2(TCIACB)
	MOVE	TCITLP,(TCIPBP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,(POINT 7,)
TCIQ02:	ILDB	TCIO,TCITLP
	JUMPE	TCIO,TCIQ03
	TBOUT	<TCIO>
	SOJG	TCITCC,TCIQ02
TCIQ03:	AOJ	TCIPBP,
	SOJG	TCIPCC,TCIQ01
	JRST	TCIREP
TCIDEL:	JUMPLE	TCISCC,TCIENR	; THERE'S NO CHARACTER TO DELETE
	MOVEI	TCIO,"\"
	TBOUT	<TCIO>
	LDB	TCIO,TCIBP
	TBOUT	<TCIO>
	ADD TCIBP,[70000,,0]		; FIX LINE BYTE PTR
	TLNE TCIBP,400000
	 SUB TCIBP,[430000,,1]
	HRRZ	UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM	UTIL,TCIPNF
	ADD TCISBP,[70000,,0]		; FIX SCAN BYTE PTR
	TLNE TCISBP,40000
	 SUB TCISBP,[430000,,1]
	SOJA	TCISCC,TCICHR
TCIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	FLAG,
	RETURN
TCIENN:	SETZ	FLAG,
	RETURN	SKIP,1
TCIEND:	MOVE	TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE	TCITLP,(TCITLP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,(POINT 7,)
	SETZ	TCITCC,
TCIE01:	IBP	TCITLP
	AOJ	TCITCC,
	CAIE	TCITCC,(TCISCC)
	 JRST	TCIE01
TCIE02:	AOJ	TCITCC,
	CAMLE	TCITCC,2(TCIACB)
	 JRST	TCIE03
	ILDB	TCIMAC,TCITLP
	JUMPE	TCIMAC,TCIE03
	TBOUT	<TCIMAC>
	JRST	TCIE02
TCIE03:	MOVE	TCITLP,TCIPLP(TCISCC)
	MOVE	FLAG,(TCITLP)
	ADDI	FLAG,4(TCIACB)
	MOVE	FLAG,(FLAG)
	ENDR	SKIP,2

; TERMINAL STRING INPUT
;   IN: IO -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IO -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR	<BP,R10,R11,R12>
	MOVE	R10,IO
	MOVE	R11,UTIL
	HLR	BP,IO
	HRLI	BP,(POINT 7,)
	SETZ	UTIL,
TSICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TSIREP
	CAIN	IO,"A"-100
	 JRST	TSIDEL
	CAIN	IO,"U"-100
	 JRST	TSIENR
	CAIN	IO,"X"-100
	 JRST	TSIENR
	CAIN	IO,177
	 JRST	TSIDEL
	CAIN	IO,15
	 JRST	TSICHR
	CAIN	IO,12
	 JRST	TSIEND
	CAIN	IO,33
	 JRST	TSIEND
	CAIN	IO,37
	 JRST	TSIEND
	CAIGE	IO," "
	 JRST	TSIBAD
	CAIL	UTIL,(R10)
	 JRST	TSIBAD
	IDPB	IO,BP
	ADDI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TSICHR
TSIREP:	TSOUT	<CRLF>
	TSOUT	<(R11)>
	JUMPL	R11,TSICHR
	HRRZI	IO,(BP)
	HLR	R12,R10
	CAIGE	IO,(R12)
	 JRST	TSICHR
	HRLI	R12,(POINT 7,)
TSIR01:	CAMN	R12,BP
	 JRST	TSICHR
	ILDB	IO,R12
	TBOUT	<IO>
	JRST	TSIR01
TSIDEL:	JUMPE	UTIL,TSIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	SUBI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
TSIEND:	SETZ	R12,
	IDPB	R12,BP
	ENDR	SKIP,1

; TERMINAL NUMBER INPUT
;   IN: IO -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IO -- NUMBER
;
$TNIN$:	BEGINR	<BP,UTIL,FLAG>
	MOVE	UTIL,IO
	MOVE	BP,[POINT 7,UBUF1]
	SETZ	FLAG,
TNICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TNIREP
	CAIN	IO,"A"-100
	 JRST	TNIDEL
	CAIN	IO,"U"-100
	 JRST	TNIENR
	CAIN	IO,"X"-100
	 JRST	TNIENR
	CAIN	IO,177
	 JRST	TNIDEL
	CAIN	IO,15
	 JRST	TNICHR
	CAIN	IO,12
	 JRST	TNIEND
	CAIN	IO,33
	 JRST	TNIEND
	CAIN	IO,37
	 JRST	TNIEND
	CAIN	IO," "
	 JRST	TNIEND
	CAIGE	IO,"0"
	 JRST	TNIBAD
	CAIL	IO,"0"(UTIL)
	 JRST	TNIBAD
	CAILE	FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST	TNIBAD
	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	FLAG,TNICHR
TNIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TNICHR
TNIREP:	TSOUT	<CRLF>
	HLRZ	IO,UTIL
	TSOUT	<(IO)>
	HRRZI	IO,(BP)
	CAIGE	IO,UBUF1
	 JRST	TNICHR
	MOVE	IO,[POINT 7,UBUF1]
TNIR01:	CAMN	IO,BP
	 JRST	TNICHR
	ILDB	X1,IO
	TBOUT	<X1>
	JRST	TNIR01
TNIDEL:	JUMPE	FLAG,TNIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SOJA	FLAG,TNICHR
TNIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	IO,
	RETURN
TNIEND:	SETZ	IO,
	IDPB	IO,BP
	MOVE	BP,[POINT 7,UBUF1]
	MOVEI	FLAG,(UTIL)
TNICAL:	ILDB	UTIL,BP
	JUMPE	UTIL,RETN(1)
	IMULI	IO,(FLAG)
	SUBI	UTIL,"0"
	ADDI	IO,(UTIL)
	JRST	TNICAL
	ENDR

; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IO -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IO+1>,UTIL>
	SETZ	IO,
DCNIN1:	DCBIN	<UTIL>
	CAIGE	UTIL,"0"
	 RETURN
	CAILE	UTIL,"9"
	 RETURN
	JUMPL	IO,DCNIN2
	MULI	IO,↑D10
	CAILE	IO,1
	 JRST	DCNIN2
	CAIN	IO,1
	 TLO	<IO+1>,400000
	MOVE	IO,<IO+1>
	ADDI	IO,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IO,
	JRST	DCNIN1
	ENDR

; $NOUT$ -- INTEGER OUTPUT
;   IN: X1 -- INTEGER
;       X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,X2
	MOVE	X3,[POINT 7,UBUF1]
	MOVEI	X4,1
	JUMPGE	X1,NOUT1
	LSHC	X1,-↑D35
	LSH	X2,-1
	DIVI	X1,(FLAG)
	JRST	.+2
NOUT1:	IDIVI	X1,(FLAG)
	ADDI	X2,60
	IDPB	X2,X3
	SKIPE	X1
	 AOJA	X4,NOUT1
	MOVE	X1,[POINT 7,UBUF2]
NOUT2:	LDB	X2,X3
	IDPB	X2,X1
	SOJ	X3,
	IBP	X3
	IBP	X3
	IBP	X3
	IBP	X3
	SOJG	X4,NOUT2
	IDPB	X4,X1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR

; ***SYSTEM DEPENDENT ROUTINES***

; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	.OPEN TTI,[.UAI,,'TTY']		; TTY input
	 THUD
	.CALL [	SETZ
		SIXBIT/TTYGET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVEM			; first set of character groups
		MOVEM			; second set of character groups
		SETZM X1]		; TTYSTS variable
	 THUD
	TLO X1,200			; disable **MORE** processing
	MOVE [030303,,030303]		; turn off echoing
	.CALL [	SETZ
		SIXBIT/TTYSET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVE			; first set of character groups
		MOVE			; second set of character groups
		SETZ X1]		; TTYSTS variable
	 THUD
	.OPEN TTO,[.UAO,,'TTY']		; TTY output
	 THUD
	.CALL [	SETZ			; host number
		SIXBIT/NETHST/
		MOVEI -1
		MOVEM
		SETZM LHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; OPEN on gensymmed socket, 32 bits
		MOVEI ICP
		[('NET')]		; network device
		[-1]			; initial local socket is gensymmed
		MOVEI DCSOKT		; initial foreign socket(DATACOMPUTER)
		SETZI DCHOST]		; foreign host(CCA)
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI ICP
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	MOVE X1,[ICP,,RCHBLK]
	.RCHST X1,			; get status of network channel
	HRRE X1,RCHBLK+4		; get status of network
	JUMPL X1,NETDED			; network dead if .LE. 0
	CAIN X1,%NSCLI			; CLS w/ input?
	 JRST ICPWIN
	CAIE X1,%NSINP			; input available?
	 CAIN X1,%NSOPN			; connection open?
	  JRST ICPWIN
	JUMPN X1,[THUD]			; any other condition is lossage
ICPCLS:	TSOUT <[ASCIZ/Cannot establish network connection/]>
	.BREAK 16,160000
NETDED:	TSOUT <[ASCIZ/ARPAnet is down/]>
	.BREAK 16,160000
ICPWIN:	MOVE X1,RCHBLK+1		; get gensymmed local socket
	ADDI X1,2			; receive
	MOVEM X1,LCLRCV
	ADDI X1,1			; transmit
	MOVEM X1,LCLTRN
	.IOT ICP,X1			; get foreign place's socket
	.CLOSE ICP,			; free up ICP socket right away
	MOVEM X1,FORRCV			; receive
	ADDI X1,1			; socket to me!
	MOVEM X1,FORTRN
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI		; DATACOMPUTER input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAO
		MOVEI DCO		; DATACOMPUTER output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCO
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	MOVEI X1,2			; offset for data sockets
	ADDM X1,LCLRCV
	ADDM X1,LCLTRN
	ADDM X1,FORRCV
	ADDM X1,FORTRN
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	.IOT DCO,["Z"-100]		; SEND QUIT
QUIT1:	DCBIN <IO>
	JRST QUIT1
QUIT2:	.CLOSE DCI,
	.CLOSE DCO,
	.BREAK 16,160000

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI DDI		; DATACOMPUTER data input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDI
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI DDO		; DATACOMPUTER data output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDO
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	.CLOSE DDI,
	.CLOSE DDO,
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;
NETDSI:	BEGINR
	MOVE UTIL,LCLRCV
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;
NETDSO:	BEGINR
	MOVE UTIL,LCLTRN
	ENDR

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOI1
	RETURN SKIP,1
LOCOI1:	TSOUT <[ASCIZ/ (Local file not found)/],CRLF>
	ENDR

;LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI LCO
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 THUD
	.CALL [	SETZ
		SIXBIT/SFDATE/
		MOVEI LCO
		SETZ LCLDAT]
	 THUD
	RETURN SKIP,1
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	.CLOSE LCI,
	.CLOSE LCO,
	ENDR

; LOCS -- LOCAL FILE (SIZE)
;
LOCS:	BEGINR
	.CALL [	SETZ
		SIXBIT/FILLEN/
		MOVEI LCI
		SETZM IO]
	 SETZ IO,			; it should not crap out
	ENDR

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;  OUT:	UTIL -- ITS DISK FORMAT DATE/TIME
;
LUTTSN:	BEGINR <BP>
	SETZ UTIL,
	ILDB X1,IO
	CAIL X1,"0"
	 CAILE X1,"9"
	  RETURN
	SUBI X1,"0"
	IMULI X1,↑D10
	ILDB X2,IO
	CAIL X2,"0"
	 CAILE X2,"9"
	  RETURN
	ADDI X1,-"0"(X2)
	ILDB X2,IO
	CAIE X2,"-"
	 RETURN
	MOVE X2,[POINT 7,X3]
	SETZ X3,
REPEAT 3,<
	ILDB X4,IO
	IDPB X4,X2
>
	MOVEI X2,↑D12
	CAMN X3,LUTTM-1(X2)
	 JRST .+3
	  SOJGE X2,.-2
	  RETURN
	ILDB X3,IO
	CAIE X3,"-"
	 RETURN
	ILDB X3,IO
	CAIL X3,"0"
	 CAILE X3,"9"
	  RETURN
	SUBI X3,"0"
	IMULI X3,↑D10
	ILDB X4,IO
	CAIL X4,"0"
	 CAILE X4,"9"
	  RETURN
	ADDI X3,-"0"(X4)
	DPB X3,[POINT 7,UTIL,8]
	DPB X2,[POINT 4,UTIL,12]
	DPB X1,[POINT 5,UTIL,17]
	ILDB X1,IO
	CAIE X1," "
	 RETURN
	ILDB X1,IO
	SUBI X1,"0"
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,6
	ILDB X2,IO
	CAIE X2,":"
	 RETURN
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,6
	ILDB X2,IO
	CAIE X2,":"
	 JRST [	IMULI X1,↑D20
		JRST LUTSN1]
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	LSH X1,1
LUTSN1:	ADDI UTIL,(X1)
	ENDR

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN:	UTIL -- ITS DISK FORMAT DATE/TIME
;	BP -- BYTE POINTER TO DESTINATION STRING
;  OUT:	BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	LDB X3,[POINT 5,UTIL,17]	; DAY
	IDIVI X3,↑D10
	ADDI X3,"0"
	ADDI X4,"0"
	IDPB X3,BP
	IDPB X4,BP
	MOVEI X3,"-"
	IDPB X3,BP
	LDB X3,[POINT 4,UTIL,12]	; MONTH
	HRRI X3,LUTTM-1(X3)
	HRLI X3,(POINT 7,)
	SCOPY (X3,BP)
	MOVEI X3,"-"
	IDPB X3,BP
	LDB X3,[POINT 7,UTIL,8]	; YEAR
	IDIVI X3,↑D10
	ADDI X3,"0"
	ADDI X4,"0"
	IDPB X3,BP
	IDPB X4,BP
	MOVEI X3," "
	IDPB X3,BP
	LDB X2,[POINT 17,UTIL,34]	; TIME IN SECONDS
	IDIVI X2,↑D3600
	MOVEI X4,(X3)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	MOVEI X2,":"
	IDPB X2,BP
	MOVEI X2,(X4)
	IDIVI X2,↑D60
	MOVEI X4,(X3)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	MOVEI X2,":"
	IDPB X2,BP
	MOVEI X2,(X4)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	SETZ X2,
	IDPB X2,BP
	ENDR				; return

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII/JAN/
	ASCII/FEB/
	ASCII/MAR/
	ASCII/APR/
	ASCII/MAY/
	ASCII/JUN/
	ASCII/JUL/
	ASCII/AUG/
	ASCII/SEP/
	ASCII/OCT/
	ASCII/NOV/
	ASCII/DEC/

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR <IO>
	SETZM LCLFN1			; < prevent assembly error
	MOVSI X1,'>  '
	MOVEM X1,LCLFN2
	HRLI IO,(POINT 7,)
LUTFN1:	CALLR LUTWRD			; get a SIXBIT word
	MOVEM X1,LCLFN1
	JUMPE X2,RETN(0)
	CAIE X2,"."
	 JRST LUTFN1
	CALLR LUTWRD
	CAIE X1,
	 MOVEM X1,LCLFN2		; use FN2 if specified
	ENDR

; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN X1, DELIMITER IN X2
;
LUTWRD:	BEGINR <BP>
	SETZ X1,			; initialize word, word pointer
	MOVE BP,[POINT 6,X1]
LUTWR1:	ILDB X2,IO			; get a character from buffer
	CAIN X2,"."
	 JRST RETN(0)
	JUMPE X2,RETN(0)
	SUBI X2," "			; SIXBITify from ASCII
	TRNN X1,77			; and save in word until word filled
	 IDPB X2,BP
	JRST LUTWR1
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETZM FFITYP
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
	  CAIA
	   JRST NETFI1
	.IOT TTO,[" "]
	.IOT TTO,["("]
	SETOM FFITYP
NETFI1:	MOVE X1,[POINT 6,LCLFN1]
	MOVEI X2,6
	MOVE X3,[POINT 7,FBUF]
	ILDB X4,X1
	JUMPE X4,.+4
	ADDI X4," "
	SKIPE FFITYP
	 .IOT TTO,X4
	SKIPE GBUF1
	 IDPB X4,X3
	SOJG X2,.-7
NETFI2:	SKIPE FFITYP
	 .IOT TTO,["."]
	MOVE X1,[POINT 6,LCLFN2]
	MOVEI X2,6
	MOVE X3,[POINT 7,EBUF]
	ILDB X4,X1
	JUMPE X4,.+4
	ADDI X4," "
	SKIPE FFITYP
	 .IOT TTO,X4
	SKIPE GBUF2
	 IDPB X4,X3
	SOJG X2,.-7
NETFI3:	SKIPN FFITYP
	 RETURN
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR <IO,BP,UTIL>
	SETZM IOBUFR
	MOVE X1,[IOBUFR,,IOBUFR+1]
	BLT X1,IOBUFR+1777
	.RDTIM X1,
	IDIVI X1,↑D30
	MOVEM X1,NTIME
	MOVE BP,[POINT 7,IOBUFR]
	MOVE UTIL,[POINT 7,FBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	MOVE UTIL,[POINT 7,EBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	.CALL [	SETZ
		SIXBIT/RFDATE/
		MOVEI LCI
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	.CALL [	SETZ
		SIXBIT/RQDATE/
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	HRLI BP,004400
	MOVE UTIL,VBUF
	IDPB UTIL,BP
	CALLR LOCS
	IDPB IO,BP
	MOVNI UTIL,17
	IDPB UTIL,BP
	HRRZI BP,(BP)
	MOVEI X1,(BP)
	SUBI BP,IOBUFR-1
	MOVEM BP,NSIZE
	SETZ UTIL,
	ADD UTIL,(X1)
	SOJ X1,
	SOJG BP,.-2
	ADDM UTIL,NSUM
	MOVN X1,NSIZE
	HRLS X1
	HRRI X1,IOBUFR
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST DEATH
	MOVE X1,X1SAVE#
	.IOT DDO,X1
	ENDR

; PUTDAT -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
PUTDAT:	BEGINR <UTIL,IO>
	CALLR LOCS			; get length of file
	AOS NSIZE
	ADDM IO,NSUM
	ADDM IO,NSIZE
	CALLR NETMSG
	 JRST PUTD4
	HRROI X1,IO
	.IOT DDO,X1
	SETZ UTIL,
PUTD1:	MOVE X1,[-2000,,IOBUFR]
	.IOT LCI,X1			; read 1K from local file
	JUMPL X1,PUTD2			; hit EOF here
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,[-2000,,IOBUFR]
	.IOT DDO,X1
	MOVSI X1,-2000			; compute checksum
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
	JRST PUTD1
PUTD2:	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,X1SAVE#
	MOVEI X1,-IOBUFR(X1)		; get # of words transferred
	JUMPE X1,PUTD3
	MOVNS X1
	HRLZS X1
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,X1SAVE#
	HRRI X1,IOBUFR
	.IOT DDO,X1
	MOVE X1,X1SAVE#
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
PUTD3:	ADDM UTIL,NSUM
	ADDM UTIL,NSUM
	CALLR NETMSG
	 JRST PUTD4
	HRROI X1,UTIL
	.IOT DDO,X1
PUTD4:	.RDTIM X1,
	IDIVI X1,↑D30
	SUBM X1,NTIME
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR <IO,UTIL>
	.RDTIM X1,
	IDIVI X1,↑D30
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	.IOT DDI,IO
	JUMPL IO,RETN(0)
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$E,,EBUF]
	.IOT DDI,IO
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$D,,ABUF]
	.IOT DDI,IO
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[POINT 7,ABUF]
	CALLR LUTTSN
	MOVEM UTIL,LCLDAT
	HRROI IO,ABUF
	.IOT DDI,IO
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	ENDR SKIP,1


; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR <IO,UTIL,FLAG>
	HRROI IO,FLAG
	.IOT DDI,IO
	JUMPE FLAG,GETD3
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SETZ UTIL,
GETD1:	CAIGE FLAG,2000
	 JRST GETD2
	SUBI FLAG,2000
	MOVE X1,[-2000,,IOBUFR]
	.IOT DDI,X1			; read 1K from DATACOMPUTER
	MOVE X1,[-2000,,IOBUFR]
	.IOT LCO,X1
	MOVSI X1,-2000			; compute checksum
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
	JRST GETD1
GETD2:	JUMPE FLAG,GETD3
	MOVN X1,FLAG
	HRLZS X1
	HRRI X1,IOBUFR
	MOVEM X1,X1SAVE#
	MOVE X1,X1SAVE#
	.IOT DDI,X1
	MOVE X1,X1SAVE#
	.IOT LCO,X1
	MOVE X1,X1SAVE#
	ADD UTIL,(X1)
	AOBJN X1,.-1
GETD3:	ADDM UTIL,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST GETD4
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
GETD4:	.RDTIM X1,
	IDIVI X1,↑D30
	SUBM X1,NTIME
	ENDR

; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR <IO>
NETMS1:	.CALL [	SETZ
		SIXBIT/WHYINT/
		MOVEI DCI
		MOVEM IO
		MOVEM IO
		SETZM IO]
	 THUD
	JUMPE IO,RETN(1)
NETMS2:	DCBIN <IO>
	CAIN IO,"?"
	 JRST DEATH
	CAIN IO,"!"
	 JRST NETMS3
	CAIE IO,"+"
	 CAIN IO,"-"
	  JRST NETMS4
	CALLR RENLIN
	JRST NETMS1
NETMS3:	CALLR RENLIP
	JRST NETMS1
NETMS4:	CALLR RENLIP
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR <IO>
	SETZM GBUF1
	LDB X1,[350700,,FBUF]
	CAIN X1,"*"
	 SETOM GBUF1
	SETZM GBUF2
	LDB X1,[350700,,EBUF]
	CAIN X1,"*"
	 SETOM GBUF2
	SETO X1,
	CAMN X1,FSBUF
	 JRST LOCFI0
	CAMN X1,ESBUF
	 JRST LOCFI0
	JRST LOCFI5
LOCFI0:	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 JRST LOCFNF
	MOVE X1,[-2000,,DIRBLK]
	.IOT X1
	.CLOSE
LOCFI1:	MOVE IO,DIRBLK+1		; POINTER TO NAME AREA
	ADDI IO,DIRBLK
	CAIN IO,DIRBLK+2000		; END OF DIRECTORY?
	 JRST LOCFNF
	MOVEI X1,5
	ADDM X1,DIRBLK+1
	SETO X1,
	CAME X1,FSBUF
	 JRST LOCFI2
	CAME X1,ESBUF
	 JRST LOCFI3
	JRST LOCFI4
LOCFI2:	MOVE X1,[POINT 7,FSBUF]
	MOVE X2,[POINT 6,X4]
	MOVEI X3,6
	SETZ X4,
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAMN X4,(IO)
	 JRST LOCFI4
	JRST LOCFI1
LOCFNF:	TSOUT <[ASCIZ/ (No Such File)/],CRLF>
	RETURN

LOCFI3:	MOVE X1,[POINT 7,ESBUF]
	MOVE X2,[POINT 6,X4]
	SETZ X4,
	MOVEI X3,6
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAME X4,1(IO)
	 JRST LOCFI1
LOCFI4:	MOVE X1,(IO)
	MOVEM X1,LCLFN1
	MOVE X1,1(IO)
	MOVEM X1,LCLFN2
LOCFI5:	CALLR LOCOI
	 RETURN
	.CLOSE
	ENDR SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR <IO>
	CALLR LOCC
	SETO X1,
	CAMN X1,FSBUF
	 JRST LOCNI0
	CAMN X1,ESBUF
	 JRST LOCNI0
	RETURN SKIP,1
LOCNI0:	MOVE IO,DIRBLK+1
	ADDI IO,DIRBLK
	CAIN IO,DIRBLK+2000
	 RETURN SKIP,1
	MOVEI X1,5
	ADDM X1,DIRBLK+1
	SETO X1,
	CAME X1,FSBUF
	 JRST LOCNI1
	CAME X1,ESBUF
	 JRST LOCNI2
	JRST LOCNI3
LOCNI1:	MOVE X1,[POINT 7,FSBUF]
	MOVE X2,[POINT 6,X4]
	MOVEI X3,6
	SETZ X4,
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAMN X4,(IO)
	 JRST LOCNI3
	JRST LOCNI0
LOCNI2:	MOVE X1,[POINT 7,ESBUF]
	MOVE X2,[POINT 6,X4]
	MOVEI X3,6
	SETZ X4,
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAME X4,1(IO)
	 JRST LOCNI0
LOCNI3:	MOVE X1,(IO)
	MOVEM X1,LCLFN1
	MOVE X1,1(IO)
	MOVEM X1,LCLFN2
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCNI0
	SKIPN GBUF1
	 JRST LOCNI4
	MOVE X1,[POINT 6,LCLFN1]
	MOVEI X2,6
	MOVE X3,[POINT 7,FBUF]
	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,.-4
LOCNI4:	SKIPN GBUF2
	 JRST LOCNI5
	MOVE X1,[POINT 6,LCLFN2]
	MOVEI X2,6
	MOVE X3,[POINT 7,EBUF]
	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,.-4
LOCNI5:	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT <FBUF>
	.IOT TTO,["."]
	TSOUT <EBUF>
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR <IO>
	SETZ X1,
	SETO X2,
	CAMN X2,FSBUF
	 TRO X1,400000
	CAMN X2,ESBUF
	 TRO X1,200000
	JUMPE X1,RETN(0)
	MOVE X2,[POINT 7,ABUF]
	MOVE X3,[POINT 7,FSBUF]
	TRNE X1,400000
	 HRRI X3,FBUF
	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,.-4
	SKIPN ESBUF
	 JRST LOCNOO
	MOVEI X4,"."
	DPB X4,X2
	MOVE X3,[POINT 7,ESBUF]
	TRNE X1,200000
	 HRRI X3,EBUF
	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,.-4
LOCNOO:	MOVEI IO,ABUF
	CALLR LUTFN
	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT ABUF
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DFTP/]
	SETNAM	0,
	OPEN	0,[	200	; TURN OFF TTY ECHOING
			SIXBIT	/TTY/
			0]
	 THUD
	MOVE	0,[SIXBIT/DSK/]
	MOVEM	0,LFCHAS+1
	GETPPN	0,
	MOVEM	0,LFIPPN
	CALLR	ICP
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<IO,UTIL>
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	MOVE	IO,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IO,GET$F
	MOVEM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IO,GET$E
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IO,GET$D
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[POINT 7,ABUF]
	CALLR	LUTTSN
	DPB	IO,[001400,,LFILE+2]
	LSH	IO,-14
	DPB	IO,[170300,,LFILE+1]
	DPB	UTIL,[141300,,LFILE+2]
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	SKIPLE	X1
	 MOVE	X1,LFCHAS
	SKIPGE	X1
	 MOVN	X1,X1
	DPB	X1,[270400,,LFILE+2]
	ENDR	SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
GETDAT:	BEGINR	<IO,UTIL,FLAG>
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,GETD2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	SETZ	UTIL,
	SKIPE	FLAGFE
	 JRST	GETD3
	OUT	LFCHAN,
	 JRST	.+2
	THUD
GETD1:
IFE F.SAIL,<
	CALLR	NETMSG
	 JRST	GETD3
>
	CAIGE	FLAG,SIZBLK
	 HRLI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 HRLI	IO,SIZBLK
	HRR	IO,LFOBUF+1
	ADDI	IO,1
	CALLR	NUTFB
	CAIGE	FLAG,SIZBLK
	 MOVEI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 MOVEI	IO,SIZBLK
	SUBI	FLAG,(IO)
	HRRZ	X1,LFOBUF+1
	ADDM	IO,LFOBUF+1
	ADDI	X1,(IO)
	ADD	UTIL,(X1)
	SOJ	X1,
	SOJG	IO,.-2
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	JUMPG	FLAG,GETD1
GETD2:	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	CAMN	IO,UTIL
	 JRST	GETD4
	TSOUT	<[ASCIZ/ (File Checksum Error)/],CRLF>
	JRST	GETD4
IFE F.SAIL,<
GETD3:	ADDM	UTIL,NSUM
	SETZ	UTIL,
	SKIPE	DDIBUF+2
	 JRST	.+6
GETD$:	STATZ	DDCHAN,020000
	 JRST	GETD4
	IN	DDCHAN,
	 JRST	.+2
	JRST	GETD4
	HRRZ	X1,DDIBUF+1
	MOVE	X2,DDIBUF+2
	ADDI	X1,(X2)
	ADD	UTIL,(X1)
	SOJ	X1,
	SOJG	X2,.-2
	ADDM	UTIL,NSUM
	SETZ	UTIL,
	SETZM	DDIBUF+2
	JRST	GETD$
>
IFN F.SAIL,<
GETD3:	IN	DDCHAN,
	 JRST	GETD3
>
GETD4:	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVE	X2,NTIME
	SUB	X1,X2
	MOVEM	X1,NTIME
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<IO,BP,UTIL>
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	HRR	BP,DDOBUF+1
	HRLI	BP,010700
	MOVE	UTIL,[POINT 7,FBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	MOVE	UTIL,[POINT 7,EBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	LDB	IO,[001400,,LFILE+2] ; CREATION DATE
	LDB	UTIL,[170300,,LFILE+1]
	LSH	UTIL,14
	IORI	IO,(UTIL)
	LDB	UTIL,[141300,,LFILE+2] ; CREATION TIME
	CALLR	LUTTNS
	DATE	IO,
	MSTIME	X1,
	IDIVI	X1,<↑D1000*↑D60>
	MOVE	UTIL,X1
	CALLR	LUTTNS
	HRLI	BP,004400
	MOVE	UTIL,VBUF
	IDPB	UTIL,BP
	CALLR	LOCS
	IDPB	IO,BP
	LDB	UTIL,[270400,,LFILE+2] ; DATA MODE
	SKIPE	UTIL
	 MOVN	UTIL,UTIL
	IDPB	UTIL,BP
	HRRZ	IO,DDOBUF+1
	MOVEM	BP,DDOBUF+1
	HRRZI	BP,(BP)
	HRRZI	X1,(BP)
	SUBI	BP,-1(IO)
	MOVEM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,(X1)
	SOJ	X1,
	SOJG	BP,.-2
	ADDM	UTIL,NSUM
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IO,UTIL>
	CALLR	LOCS
	AOS	NSIZE
	ADDM	IO,NSUM
	ADDM	IO,NSIZE
	AOS	DDOBUF+1
	MOVEM	IO,@DDOBUF+1
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	SETZ	UTIL,
PUTD1:	SOSG LFIBUF+2
	 IN LFCHAN,
	  CAIA
	   JRST PUTD2
	ILDB X1,LFIBUF+1
	ADD UTIL,X1
	SOSLE DDOBUF+2
	 JRST PUTD1A
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD3
	MOVE X1,X1SAVE#
	OUT DDCHAN,
	 JRST PUTD1A
IFN F.SAIL,<THUD>
IFE F.SAIL,<
	STATO	DDCHAN,400000
	 THUD
	JRST	PUTD3
>
PUTD1A:	IDPB X1,DDOBUF+1
	JRST PUTD1
PUTD2:	STATO LFCHAN,20000
	 THUD
	AOS	NSIZE
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	AOS	DDOBUF+1
	MOVEM	UTIL,@DDOBUF+1
IFE F.SAIL,<
	OUT	DDCHAN,
	 JRST	.+3
	STATO	DDCHAN,400000
	 THUD
>
IFN F.SAIL,<
	OUT	DDCHAN,
	 JRST	.+2
	THUD
>
PUTD3:	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVE	X2,NTIME
	SUB	X1,X2
	MOVEM	X1,NTIME
	ENDR

; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IO,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IO,LINP		; LISTEN ON INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IO,DCIBLK+.IBERR
	CAIE	IO,.IESKT
	 JRST	ICPEIL
	MOVE	IO,PWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	X4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	X3,
	SETZ	FLAG,
ICPRDV:	MOVE	IO,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IO,WRKBLK+.IBDEV
	MOVEI	X1,(X3)
	IDIVI	X1,10
	JUMPE	X1,ICPRD1
	ADDI	X1,20
	ADDI	X2,20
	DPB	X1,[140600,,WRKBLK+.IBDEV]
	DPB	X2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	X2,20
	DPB	X2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IO,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IO,DCHOST
	 JRST	ICPRD3
	PJOB	X1,
	HLRZ	X2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	X2,(X1)
	 JRST	ICPRD3
	MOVE	IO,WRKBLK+.IBLCL
	CAMN	IO,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
	SUBI	IO,2
	CAMN	IO,UTIL		; INPUT DATA SOCKET
	 JRST	ICPCLI
ICPRD3:	MOVEI	IO,1			; OUTPUT DATA SOCKET
	MOVEM	IO,WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	HRRZ	IO,WRKBLK+.IBHST
	CAIE	IO,DCHOST
	 JRST	ICPRD4
	PJOB	X1,
	HLRZ	X2,WRKBLK+.IBSTT
	CAIE	X2,(X1)
	 JRST	ICPRD4
	MOVE	IO,WRKBLK+.IBLCL
	SUBI	IO,3
	CAMN	IO,UTIL
	 JRST	ICPCLO
ICPRD4:	ADDI	X3,1
	CAIGE	X3,(X4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ/ (Connections in use)/]
	EXIT
ICPCLS:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IO,1
	MOVEM	IO,WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPCLI:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ (Retrieve interrupted:  connection closed)
/]
	JRST	ICPRDV
ICPCLO:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ (Store interrupted:  connection closed)
/]
	JRST	ICPRDV
ICPICP:	MOVE	IO,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IO,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IO,DCCHAS+1
	MOVE	IO,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IO,OICP
	CALL	IO,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IO,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IO,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IO,ICPBUF+1
	MOVE	IO,1(IO)		; GET THE SOCKET NUMBER
	LSH	IO,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IO,DCOBLK+.IBRMT
	AOJ	IO,
	MOVEM	IO,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IO,OINP		; OPEN INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IO,OOUT		; OPEN OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IO,PWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IO,WRKBLK+.IBHST
	MOVEM	IO,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

ICPBEG:	; Tovar says this is the right thing to do - MRC
	PJOB X2,		; GET JOB #
	TIMER X1,		; GET A "RANDOM" VALUE
	ANDI X1,377770		; BUT INSURE ONLY A HALFWORD
	MOVSS X4,X2		; RECEIVE SOCKET
	ADDI X2,(X1)		; THIS BARFUCIOUS CROCK IS BECAUSE SAIL
	ADDI X4,(X1)		; DOESN'T ALWAYS RESET SOCKETS FAST ENOUGH
				; AND ALL SORTS OF RANDOM CRAP HAPPENS.
	ADDI X4,1		; TRANSMIT SOCKET
	MOVEI X1,13		; SAIL'S HOST ADDRESS NUMBER
	MOVEM X1,LHOST	; SAVE IT AWAY
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X3,40
	MOVEM X3,CONECB+BSLOC
	MOVEI X3,DCSOKT
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE X3,FRS
	LSH X3,-4
	MOVEM X3,FRS
	ADDI X3,1
	MOVEM X3,FSS#
	ADDI X2,2
	MOVEM X2,LRS#
	ADDI X4,2
	MOVEM X4,LSS#
	MOVE X1,CONECB+LSLOC
	MOVEM X1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 5,24,0,12,0
		]		; TIME OUT CLS, RFNM, AND RFC
	MOVEI X1,↑D8
	DPB X1,[POINT 6,DCIBUF+1,11]
	DPB X1,[POINT 6,DCOBUF+1,11]
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MOVE X3,FSS
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI X3,4
	MOVEM X3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/? Cannot establish network connection/]
	EXIT
>
; (((↑↑↑)))
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IO,"Z"-100
	IDPB	IO,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+1
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPE	FLAGDD
	 CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT03:	IFE F.SAIL,<
	MOVE	IO,COUT		; CLOSE OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
>
QUIT04:	IFE F.SAIL,<
	MOVE	IO,CINP		; CLOSE INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
>
	EXIT

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
IFE F.SAIL,<
	RELEAS	DDCHAN,
	SETZM	DCDBLK+.IBDEV
	MOVEI	X1,104
	MOVEM	X1,DCDBLK+.IBLCL
	MOVE	X1,DCIBLK+.IBRMT
	ADDI	X1,2
	MOVEM	X1,DCDBLK+.IBRMT
	MOVE	X1,ODAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
	MOVE	X1,DCDBLK+.IBDEV
	MOVEM	X1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
>
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOI2
	MTAPE DDCHAN,[	15		;ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LRS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FSS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
>
NETOI2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
IFE F.SAIL,<
	RELEAS	DDCHAN,
	SETZM	DCDBLK+.IBDEV
	MOVEI	X1,105
	MOVEM	X1,DCDBLK+.IBLCL
	MOVE	X1,DCOBLK+.IBRMT
	ADDI	X1,2
	MOVEM	X1,DCDBLK+.IBRMT
	MOVE	X1,ODAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
	MOVE	X1,DCDBLK+.IBDEV
	MOVEM	X1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
>
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOO2
	MTAPE DDCHAN,[	15		; ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LSS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FRS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	RETURN SKIP,1
>
NETOO2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
IFE F.SAIL,<
	STATZ	DDCHAN,400000
	 RETURN
>
IFN F.SAIL,<
	MOVEI 3			; TERMINATE CONNECTION
	MOVEM CONECB
	SETOM CONECB+WFLOC	; WAIT FOR CLS REC'VD
	MTAPE DDCHAN,CONECB	; CLOSE IT
>
	RELEAS	DDCHAN,
IFE F.SAIL,<
	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETC1
	RETURN
NETC1:	TTCALL	3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
	ENDR

; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR	<IO>
NETMS1:	MOVE IO,DCIBUF+2		; CHECK FOR CRUFT READ BUT STILL
 	CAILE IO,20			;  NOT INPUT BY DFTP
	 JRST NETMS2			; YUP THERE IS INPUT
	HRRZ IO,DCIBUF
	HRRZ IO,(IO)
	SKIPGE (IO)
	 JRST NETMS2
IFN F.SAIL,<	MTAPE DCCHAN,[10]>
IFE F.SAIL,<	STATO	DCCHAN,002000>
	 RETURN	SKIP,1
NETMS2:	DCBIN	<IO>
	CAIN	IO,"?"
	 JRST	DEATH
	CAIN	IO,"!"
	 JRST	NETMS3
	CAIN	IO,"+"
	 JRST	NETMS4
	CAIN	IO,"-"
	 JRST	NETMS4
	CALLR	RENLIN
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	JRST	NETMS1
NETMS4:	CALLR	RENLIP
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
IFN F.SAIL,<MOVE UTIL,LRS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,104>
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
IFN F.SAIL,<MOVE UTIL,LSS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,105>
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	NETFI0
	CAMN	X1,ESBUF
	 JRST	NETFI0
	JRST	NETFI1
NETFI0:	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,LUTDSF
	TTCALL	3,[ASCIZ/)
/]
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	MOVE	X1,[POINT 6,LFILE]
	MOVEI	X2,6
	MOVE	X3,[POINT 7,FBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
NETFI2:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[POINT 6,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[POINT 7,EBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
	ENDR

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IO,BP>
	SKIPE FLAGDD
	 OUTSTR (X1)
	MOVEI	BP,(X1)
	HRLI	BP,(POINT 7,)
NUTMOL:	ILDB	IO,BP
	JUMPE	IO,RETN(0)
	SKIPE	DCOBUF+2
	 JRST	NUTMOB
NUTMOO:	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
NUTMOB:	SOS	DCOBUF+2
	IDPB	IO,DCOBUF+1
	JRST	NUTMOL
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR	<IO,UTIL>
	MOVE X1,DCIBUF+1
	MOVE UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IO,X1
	JUMPE	IO,NUTDDL
	TTCALL	1,IO
	JRST	NUTDDL
	ENDR

; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
;   IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB:	BEGINR
	HLRE	X1,IO
	SKIPGE	X1
	 MOVN	X1,X1
	HRRZI	X2,(IO)
	SKIPE	DDIBUF+2
	 JRST	NUTFB2
NUTFB1:
IFE F.SAIL,<
	SKIPL	IO
	 JRST	NUTFB$
	STATZ	DDCHAN,020000
	 RETURN
	MOVE	X3,DCDBLK+.IBDEV
	MOVEM	X3,WRKBLK+.IBDEV
	MOVE	X3,DCDBLK+.IBLCL
	MOVEM	X3,WRKBLK+.IBLCL
	MOVE	X3,SWRK
	CALL	X3,[SIXBIT/IMPUUO/]
	 JRST	.+3
	LDB	X3,[000600,,WRKBLK+.IBSTT]
	JUMPE	X3,RETN(0)
NUTFB$:
>
	IN	DDCHAN,
	 JRST	NUTFB2
	SKIPL	IO
	 THUD
	STATO	DDCHAN,020000
	 THUD
	RETURN
NUTFB2:	HRRZ	X3,DDIBUF+1
	HRLI	X2,1(X3)
	MOVEI	X3,(X1)
	CAMLE	X3,DDIBUF+2
	 MOVE	X3,DDIBUF+2
	ADDI	X3,-1(X2)
	BLT	X2,(X3)
	CAMG	X1,DDIBUF+2
	 JRST	NUTFB3
	SUB	X1,DDIBUF+2
	MOVEI	X2,1(X3)
	JRST	NUTFB1
NUTFB3:	ADDM	X1,DDIBUF+1
	MOVE	X2,DDIBUF+2
	SUBI	X2,(X1)
	MOVEM	X2,DDIBUF+2
	SKIPL	IO
	 RETURN
	ENDR	SKIP,1

; FATAL NETWORK ERROR MESSAGES
;
; (((NOT SAIL)))
IFE F.SAIL,<
ICPERD:	TTCALL	3,[ASCIZ / ?? Restart failure ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ / ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ / ?? Output socket listen failure ??/]
	JRST	QUIT04
ICPET:	TTCALL	3,[ASCIZ / ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT03
ICPEF:	TTCALL	3,[ASCIZ / ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ / The datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ / (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ / (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ / (timeout)/]
	TTCALL	3,[ASCIZ /.
/]
	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	QUIT03
	JRST	QUIT03
NETEIC:	TTCALL	3,[ASCIZ / ?? Input failure (connection) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ / ?? Output failure (connection) ??/]
	JRST	QUIT04
NETECF:	TTCALL	3,[ASCIZ / ?? File control failure ??/]
	JRST	QUIT03
>
; (((↑↑↑)))
NETEIT:	TTCALL	3,[ASCIZ / ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ / ?? Output failure (transfer) ??/]
	JRST	QUIT

; (((SAIL)))
IFE F.SAIL,<
OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
ODAT:	001000+.IUCON,,DCDBLK	; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT:	.IUCLS,,DCDBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK
>
; (((↑↑↑)))

;(((SAIL)))
IFN F.SAIL,< 
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE X1,STTBLK+1
	IOR X1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN X1,060000
	 RETURN SKIP,1
	ENDR
>
;(((↑↑↑↑)))

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR <IO>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
IFE F.SAIL,<
	LOOKUP	LFCHAN,LFILEB	; PREPARE FILE FOR INPUT
>
IFN F.SAIL,<	; SAIL DOES NOT HAVE EXTENDED LOOKUP
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3		; MUST CLEAR FOR SAIL PPN'S
	LOOKUP LFCHAN,LFILE	; PREPARE FILE FOR INPUT
>
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	TTCALL	3,[ASCIZ / ?? Local channel OPEN failure ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	TTCALL	3,[ASCIZ / (Local file not found)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR	<IO,<IO+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IO,<LFILE+1>
	MOVE	<IO+1>,<LFILE+2>
	SETZM LFILE+3
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	.+3
	 JRST	.+2
	JRST	LOCOO1
	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IO,<LFILE+1>
	MOVEM	<IO+1>,<LFILE+2>
IFE F.SAIL,<
	ENTER	LFCHAN,LFILEB	; PREPARE FILE FOR OUTPUT
>
IFN F.SAIL,<	; NO EXTENDED ENTER ON SAIL
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3
	ENTER LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
>
	 JRST	LOCOO2
	RETURN	SKIP,1
LOCOO2:	TTCALL↓3,[ASCIZ/ (Local file creation failure)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE	FLAGFE
	 RETURN
	RELEAS	LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
IFE F.SAIL,<
	MOVE	IO,LFILE+3	; SIZE IN WORDS FROM EXTENDED LOOKUP
>
IFN F.SAIL,<	; SAIL HAS A FULL WORD SWAPPED -LENGTH(HOW SEXY!!!)
	MOVS IO,LFILE+3		; - LENGTH
	MOVNS IO		; + LENGTH
>		; DON'T YOU WISH BOTTOMS-10 WERE SMART LIKE THIS?
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR	<IO>
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	LOCFI0
	CAMN	X1,ESBUF
	 JRST	LOCFI0
	JRST	LOCFI5
LOCFI0:	SETZM	LUTDSP
LOCFI1:	CALLR	LUTDS
	 JRST	.+2
	JRST	.+3
	TTCALL	3,[ASCIZ/ (No Such File)
/]
	RETURN
	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCFI2
	CAME	X1,ESBUF
	 JRST	LOCFI3
	JRST	LOCFI4
LOCFI2:	MOVE	X1,[POINT 7,FSBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCFI1
	JUMPE	X4,LOCFI4
	CAIN	X4,"."
	 JRST	LOCFI4
	JRST	LOCFI1
LOCFI3:	MOVE	X1,[POINT 7,ESBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X4,X2
	JUMPE	X4,.+4
	CAIE	X4,"."
	 JRST	.-3
	ILDB	X4,X2
	ILDB	X3,X1
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCFI1
	JUMPE	X4,LOCFI4
	JRST	LOCFI1
LOCFI4:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
LOCFI5:	CALLR	LOCOI
	 RETURN
	CALLR	LOCC
	ENDR	SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR	<IO>
	CALLR	LOCC
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	LOCNI0
	CAMN	X1,ESBUF
	 JRST	LOCNI0
	RETURN	SKIP,1
LOCNI0:	CALLR	LUTDS
	 RETURN	SKIP,1
	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCNI1
	CAME	X1,ESBUF
	 JRST	LOCNI2
	JRST	LOCNI3
LOCNI1:	MOVE	X1,[POINT 7,FSBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCNI0
	JUMPE	X4,LOCNI3
	CAIN	X4,"."
	 JRST	LOCNI3
	JRST	LOCNI0
LOCNI2:	MOVE	X1,[POINT 7,ESBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X4,X2
	JUMPE	X4,.+4
	CAIE	X4,"."
	 JRST	.-3
	ILDB	X4,X2
	ILDB	X3,X1
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCNI0
	JUMPE	X4,LOCNI3
	JRST	LOCNI0
LOCNI3:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
	CALLR	LOCOI
	 JRST LOCNI0
	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,LUTDSF
	TTCALL	3,[ASCIZ/)
/]
	SKIPN	GBUF1
	 JRST	LOCNI4
	MOVE	X1,[POINT 6,LFILE]
	MOVEI	X2,6
	MOVE	X3,[POINT 7,FBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
LOCNI4:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[POINT 6,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[POINT 7,EBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR	<IO>
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	JUMPE	X1,RETN(0)
	MOVE	X2,[POINT 7,ABUF]
	MOVE	X3,[POINT 7,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[POINT 7,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
LOCNO0:	MOVEI	IO,ABUF
	CALLR	LUTFN
	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,ABUF
	TTCALL	3,[ASCIZ/)
/]
	ENDR

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IO,BP,UTIL>
	HRRI	BP,(IO)
	HRLI	BP,(POINT 7,)
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
IFN F.SAIL,<SETZM LFILE+3>
	MOVEI	X1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	X2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IO,BP
	JUMPE	IO,RETN(0)
	CAIN	IO,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IO,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IO,77	;   AND REMOVAL OF HIGH BITS
	XCT	(X1)		; EXECUTE THE PROPER ROTATE
	IORM	IO,(X2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	X1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	X2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	X1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	X2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IO,-6	; HIGH ORDER
	ROT	IO,-14
	ROT	IO,22
	ROT	IO,14
	ROT	IO,6
	ROT	IO,0		; LOW ORDER
	ENDR

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
LUTDS1:	JSP X1,LUTDSI
	JUMPE X2,[	JSP X1,LUTDSI
			; (((SAIL)))
			IFN F.SAIL,<
			REPEAT ↑D14,<JSP X1,LUTDSI>
			>
			; (((↑↑↑)))
			JRST LUTDS1]	; IGNORE HOLES IN DIRECTORY
	MOVE X3,[POINT 7,LUTDSF]
LUTDS2:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS2
	MOVEI X1,"."
	IDPB X1,X3
	JSP X1,LUTDSI
	ANDCMI X2,-1
LUTDS3:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS3
	SETZ X1,
	IDPB X1,X3
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP X1,LUTDSI>		;IGNORE EXTRA SAIL UFD CRUFT
>
; (((↑↑↑)))
	RETURN	SKIP,1
LUTDSI:	SOSG LDIBUF+2
	 IN LDCHAN,
	  CAIA
	   JRST LUTDSD
	ILDB X2,LDIBUF+1
	JRST (X1)
LUTDSS:	RELEAS	LDCHAN,
	MOVE	X1,LFIPPN
	MOVEM	X1,LDIR
	MOVE	X1,LFCHAS+1
	MOVEM	X1,LDCHAS+1
	MOVE	X1,[SIXBIT/UFD/]
	MOVEM	X1,LDIR+1
	SETZM	LDIR+2
IFE F.SAIL,<MOVE X1,[1,,1]>
IFN F.SAIL,<MOVE X1,[SIXBIT/  1  1/]>
	MOVEM	X1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	SETOM LUTDSP
	JRST LUTDS1
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 TTCALL	3,[ASCIZ/ ?? Local directory failure ??
/]
	RELEAS	LDCHAN,
	ENDR

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN: IO -- DATE INTEGER
;	UTIL -- TIME INTEGER
;	BP -- BYTE POINTER TO DESTINATION STRING
;   OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	MOVE	X1,IO
	IDIVI	X1,↑D31
	MOVEI	X3,(X1)
	MOVEI	X1,1(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D12
	MOVEI	X3,(X1)
	HRRI	X1,LUTTM(X2)
	HRLI	X1,(POINT 7,)
	SCOPY	(X1,BP)
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,↑D64(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1," "
	IDPB	X1,BP
	MOVE	X1,UTIL
	IDIVI	X1,↑D60
	MOVEI	X3,(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,":"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	SETZ	X1,
	IDPB	X1,BP
	ENDR

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;   OUT: IO -- DATE INTEGER
;	 UTIL -- TIME INTEGER
;
LUTTSN:	BEGINR	<BP>
	MOVE	BP,IO
	SETZ	IO,
	SETZ	UTIL,
	ILDB	X1,BP
	CAIL	X1,"0"
	 CAILE	X1,"9"
	  RETURN
	MOVEI	X4,-"0"(X1)
	IMULI	X4,↑D10
	ILDB	X1,BP
	ADDI	X4,-"0"(X1)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	MOVE	X3,[POINT 7,X2]
	SETZ	X2,
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	MOVEI	X3,↑D11
	CAMN	X2,LUTTM(X3)
	 JRST	.+3
	SOJGE	X3,.-2
	RETURN
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	ILDB	X1,BP
	MOVEI	X2,-"0"(X1)
	IMULI	X2,↑D10
	ILDB	X1,BP
	ADDI	X2,-"0"(X1)
	SUBI	X2,↑D64
	IMULI	X2,↑D12
	ADDI	X2,(X3)
	IMULI	X2,↑D31
	ADDI	X2,-1(X4)
	ILDB	X1,BP
	CAIE	X1," "
	 RETURN
	ILDB	X1,BP
	MOVEI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,6
	ILDB	X1,BP
	CAIE	X1,":"
	 RETURN
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	MOVE	IO,X2
	MOVE	UTIL,X3
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII	/JAN/
	ASCII	/FEB/
	ASCII	/MAR/
	ASCII	/APR/
	ASCII	/MAY/
	ASCII	/JUN/
	ASCII	/JUL/
	ASCII	/AUG/
	ASCII	/SEP/
	ASCII	/OCT/
	ASCII	/NOV/
	ASCII	/DEC/

; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS:	MOVE	IO,[IN DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[OUT DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[IN LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	MOVE	IO,[OUT LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	TTCALL	3,[ASCIZ/ ?? Impossible event at /]
	MOVEI	IO,-1(FLAG)
	TNOUT	(IO,10)
	TTCALL	3,[ASCIZ / ??/]
	EXIT
IOERDD:	GETSTS	DDCHAN,ABUF
	JRST	.+2
IOERLF:	GETSTS	LFCHAN,ABUF
	TTCALL	3,[ASCIZ/ ?? Data error at /]
	MOVEI	IO,-3(FLAG)
	TNOUT	(IO,10)
	TTCALL	3,[ASCIZ/ with status /]
	MOVE	IO,ABUF
	TNOUT	(IO,10)
	TTCALL	3,[ASCIZ / ??
/]
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	JRST	QUIT
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	X1,[SIXBIT/DFTP/]
	SETNM
	HRRZI	X1,-1
	RFMOD
	TRZ	X2,006000	; (1B24+1B25)
	SFMOD
	MOVE	X2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
	MOVE	X3,[252525,,253000] ;   AND EOL'S (NO NULLS)
	SFCOC
	MOVEI	X1,400000	; FOR THIS FORK
	MOVE	X2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVE	X1,[17,,0]	; ↑O ON CHANNEL 0
	ATI
	MOVEI	X1,400000	; FOR THIS FORK
	MOVE	X2,[1B0+1B10+1B11+1B15] ; TTY, EOF, DATA ERROR, ILI
	AIC			; ACTIVATE CHANNELS
	SETZM	FLAGCO
	SETZM	FLAGEF
	SETZM	FLAG20
	MOVE	X1,[SIXBIT/LOADTB/]
	SYSGT
	SKIPN	X2
	 SETOM	FLAG20
	CALLR	ICP
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,FBUF]
	MOVNI	X3,GET$F
	SETOM	FLAGEF
	SIN
	SKIPN	FLAGEF
	 RETURN
	SETZM	FLAGEF
	MOVEI	BP,GET$F
	MOVEM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,EBUF]
	MOVNI	X3,GET$E
	SIN
	MOVEI	BP,GET$E
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,GET$D
	SIN
	MOVEI	BP,GET$D
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,[POINT 7,PAGE]
	SETZ	X2,
	IDTIM
	 SETZ	X2,
	MOVEM	X2,ABUF
	MOVE	X1,DCDJFN
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	MOVEM	X2,<ABUF+1>
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	MOVEM	X2,<ABUF+2>
	ENDR	SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR	<IO,BP,UTIL>
	SETZ	UTIL,
	MOVE	X1,DCDJFN
	BIN
	ADDM	X2,NSUM
	MOVN	IO,X2
	ADDI	X2,3
	ADDM	X2,NSIZE
	JUMPE	IO,GETD2
	SETZM	FLAGSM
GETD1:	CALLR	NETMSG
	 JRST	GETD7
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	HRRZ	X1,LJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SKIPN	FLAGFE
	 SOUT
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,GETD1
GETD2:	MOVE	X1,DCDJFN
	BIN
	ADD	UTIL,X2
	ADDM	UTIL,NSUM
	BIN
	ADDM	X2,NSUM
	CAMN	X2,UTIL
	 JRST	GETD3
	TSOUT	<[ASCIZ/ (File checksum error)/],CRLF>
GETD3:	SKIPE	FLAGFE
	 JRST	GETD8
	HRROI	X1,LFILE
	HRRZ	X2,LJFN
	MOVE	X3,[022220,,000001]
	JFNS
	CALLR	LOCC
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	GETD4
	CAMN	X1,ESBUF
	 JRST	GETD4
	CAMN	X1,VSBUF
	 JRST	GETD4
	JRST	GETD5
GETD4:	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,LFILE
	PSOUT
	HRROI	X1,CRLF
	PSOUT
GETD5:	CALLR	LOCOI
	 JRST	GETD8
	MOVE	X3,<ABUF+2>
	JUMPLE	X3,GETD6
	HRR	X1,LJFN
	HRLI	X1,11		; OFFSET 11
	HRLZI	X2,007700	; BYTESIZE (B6-B11)
	LSH	X3,30
	CHFDB
	HRR	X1,LJFN
	HRLI	X1,12		; OFFSET 12 (BYTE COUNT)
	SETO	X2,
	MOVE	X3,<ABUF+1>
	CHFDB
GETD6:	SKIPN	ABUF
	 JRST	GETD8
	MOVEI	X1,400000
	RPCAP
	TRNN	X2,600000	; (1B18+1B19) WHEEL OR OPER
	 JRST	GETD8
	MOVE	UTIL,X3
	TRO	X3,(X2)
	EPCAP			; ENABLE (!)
	HRR	X1,LJFN
	HRLI	X1,14		; OFFSET 14 (LAST WRITE)
	SETO	X2,
	MOVE	X3,ABUF
	CHFDB
	MOVEI	X1,400000
	MOVE	X3,UTIL
	EPCAP			; RESET CAPABILITIES
	JRST	GETD8
GETD7:	MOVE	X1,DCDJFN
	SIBE
	 JRST	.+2
	JRST	GETD8
	BIN
	JRST	.-4
GETD8:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVE	X2,NTIME
	SUB	X3,X2
	MOVEM	X3,NTIME
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	BP,[POINT 7,PAGE]
	MOVE	UTIL,[POINT 7,FBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	MOVE	UTIL,[POINT 7,EBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	HRRZ	X1,LJFN
	MOVE	X2,[1,,14]	; 1 WORD, OFFSET 14 (LAST WRITE)
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	PUTF1
	SETZ	X1,
	IDPB	X1,BP
	JRST	PUTF2
PUTF1:	MOVE	X1,BP
	MOVE	X2,UBUF1
	SETZ	X3,
	ODTIM
	IBP	X1
	MOVE	BP,X1
PUTF2:	GTAD
	MOVE	X2,X1
	MOVE	X1,BP
	ODTIM
	IBP	X1
	MOVEI	BP,(X1)
	MOVE	UTIL,VBUF
	MOVEM	UTIL,1(BP)
	ADDI	BP,1
	HRRZ	X1,LJFN
	MOVE	X2,[2,,11]	; 2 WORDS, OFFSET 11 (BYTESIZE & COUNT)
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	PUTF3
	SETZM	UBUF1
	SETZM	<UBUF1+1>
PUTF3:	MOVE	UTIL,<UBUF1+1>
	MOVEM	UTIL,1(BP)
	LDB	UTIL,[300600,,UBUF1]
	MOVEM	UTIL,2(BP)
	ADDI	BP,2
	MOVEI	UTIL,1(BP)
	SUBI	UTIL,PAGE
	MOVEM	UTIL,NSIZE
	MOVEI	BP,-1(UTIL)
	SETZ	UTIL,
	ADD	UTIL,PAGE(BP)
	SOJGE	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVN	X3,NSIZE
	SOUT
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IO,BP,UTIL>
	CALLR	LOCS
	MOVE	X1,DCDJFN
	MOVE	X2,IO
	BOUT
	ADDM	X2,NSUM
	ADDI	X2,2
	ADDM	X2,NSIZE
	MOVN	IO,IO
	SETZ	UTIL,
	JUMPE	IO,PUTD2
	SETZM	FLAGSM
PUTD1:	HRRZ	X1,LJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	CALLR	NETMSG
	 JRST	PUTD3
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SOUT
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,PUTD1
PUTD2:	MOVE	X1,DCDJFN
	MOVE	X2,UTIL
	BOUT
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	MOVEI	X2,21
	MTOPR
PUTD3:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVE	X2,NTIME
	SUB	X3,X2
	MOVEM	X3,NTIME
	ENDR

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:20./]
	SETZ	X3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JRST	.+1		; CVHST SUCCESS OR NOUT FAILURE
	MOVN	X2,DCSOCK
	NOUT
	 JRST	.+1
	HRLZI	X1,1	; SHORT GTJFN
	HRROI	X2,UBUF1
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	X2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	X2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:22./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	X2,ICPSOC
	NOUT
	 JRST	.+1
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	X1,DCOJFN
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	X1,DCIJFN
	MOVE	X2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	X1,DCOJFN
	MOVE	X2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	MOVE	X1,[SIXBIT/LHOSTN/]
	SYSGT
	MOVEM	X1,LHOST
	ENDR

; NETWORK QUIT
;
QUIT:	MOVE	X1,DCOJFN
	MOVEI	X2,"Z"-100
	BOUT
	MOVEI	X2,21
	MTOPR
	SETOM	FLAGEF
QUIT01:	DCBIN	<IO>
	SKIPE	FLAGEF
	 JRST	QUIT01
	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:24./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	X2,ICPSOC
	SUBI	X2,3
	NOUT
	 JRST	.+1
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN
	 JRST	NETOI2
	MOVEM	X1,DCDJFN
	MOVE	X2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
	OPENF
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	RLJFN
	 JRST	NETOI2
NETOI2:	HRROI	X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:25./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	X2,ICPSOC
	SUBI	X2,2
	NOUT
	 JRST	.+1
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN
	 JRST	NETOO2
	MOVEM	X1,DCDJFN
	MOVE	X2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	RLJFN
	 JRST	NETOO2
NETOO2:	HRROI	X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVE	X1,DCDJFN
	CLOSF
	 JRST	NETC1
	RETURN
NETC1:	HRROI	[ASCIZ/ ?? Network connection CLOSE failure ??
/]
	PSOUT
	ENDR

; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR
	SKIPE	FLAGSM
	 RETURN	SKIP,1
NETMS1:	MOVE	X1,DCIJFN
	SIBE
	 JRST	.+2
	RETURN	SKIP,1
	BIN
	CAIN	X2,"!"
	 JRST	NETMS2
	CAIN	X2,"+"
	 JRST	NETMS3
	CAIN	X2,"-"
	 JRST	NETMS3
	CAIN	X2,"."
	 JRST	NETMS4
	CAIN	X2,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JRST	NETMS1
NETMS2:	CALLR	RENLIP
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	RETURN
NETMS4:	SETOM	FLAGSM
	CALLR	RENLIN
	ENDR	SKIP,1

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
	GJINF
	HRRZI	UTIL,(X2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,24
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
	GJINF
	HRRZI	UTIL,(X2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,25
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE NAME
;
NETFFI:	BEGINR
	MOVE	X2,LJFN
	TLNN	X2,770000
	 JRST	NETFI1
	HRROI	X1,LFILE
	HRRZI	X2,(X2)
	SETZ	X3,
	JFNS
	MOVE	X1,[LFILE,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,CRLF
	PSOUT
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,002000
	JFNS
	MOVE	X1,[UBUF2,,FBUF]
	CALLR	LUTVR
NETFI2:	SKIPN	GBUF2
	 JRST	NETFI3
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,000200
	JFNS
	MOVE	X1,[UBUF2,,EBUF]
	CALLR	LUTVR
NETFI3:	SKIPL	VSBUF
	 RETURN
	MOVN	X1,VBUF
	MOVEM	X1,VSBUF
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	X1,[ASCIZ/ The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	X1,[ASCIZ/ The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	X1,[ASCIZ/ ?? ICP CLOSF failure ??/]
	JRST	NETEQ
ICPEOG:	HRROI	X1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
	JRST	NETEQ
ICPEIG:	HRROI	X1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
	JRST	NETEQ
ICPEIO:	HRROI	X1,[ASCIZ/ ?? ICP output OPENF failure ??/]
	JRST	NETEQ
ICPEOO:	HRROI	X1,[ASCIZ/ ?? ICP input OPENF failure ??/]
	JRST	NETEQ

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	HRLZI	X1,100101	; OLD FILE, *'S, SHORT CALL
	MOVE	X2,[POINT 7,LFILE]
	GTJFN
	 JRST	LOCOI1
	MOVEM	X1,LJFN
	HRRZI	X1,(X1)
	MOVE	X2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	HRROI	X1,[ASCIZ/ (Local file not found)
/]
	PSOUT
	RETURN
LOCOI2:	HRROI	X1,[ASCIZ/ (Local file not available)
/]
	PSOUT
	HRRZ	X1,LJFN
	RLJFN
	 RETURN
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	HRLZI	X1,600001	; VN, WRITE, SHORT
	MOVE	X2,[POINT 7,LFILE]
	GTJFN
	 JRST	LOCOO2
	MOVEM	X1,LJFN
	MOVE	X2,[440000,,100000] ; 36 BIT BYTE, READ
	OPENF
	 JRST	LOCOO1
	RETURN	SKIP,1
LOCOO1:	HRRZ	X1,LJFN
	RLJFN
	 JRST	.+1
LOCOO2:	HRROI	X1,[ASCIZ/ (Local file creation failure)
/]
	PSOUT
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE	FLAGFE
	 RETURN
	HRRZ	X1,LJFN
	CLOSF
	 JRST	LOCC1
	RETURN
LOCC1:	HRROI	X1,[ASCIZ/ ?? Local file CLOSE failure ??
/]
	PSOUT
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
	HRRZ	X1,LJFN
	MOVE	X2,[2,,11]	; READ 2 WORDS, OFFSET OF 11
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	.+3
	SETZ	IO,
	RETURN
	LDB	X1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
	MOVEI	X2,↑D36
	IDIVI	X2,(X1)	; BYTES/WD
	MOVE	X3,UBUF1+1	; BYTE COUNT TO EOF
	ADDI	X3,-1(X2)	; ACCOUNT FOR TRUNCATION
	IDIVI	X3,(X2)	; NUMBER OF WORDS
	MOVE	IO,X3
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	CALLR	LOCOI
	 RETURN
	SKIPE	GBUF1
	 JRST	LOCFI0
	SKIPE	GBUF2
	 JRST	LOCFI0
	CALLR	LOCC
	RETURN	SKIP,1
LOCFI0:	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	MOVE	X3,[002200,,000001]
	JFNS
	CALLR	LOCC
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	.+2
	RETURN	SKIP,1
	MOVE	X1,[UBUF2,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/ (Bad remote file name /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,[ASCIZ/)
/]
	PSOUT
	ENDR

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR
	HRRZ	X1,LJFN
	TLO	X1,400000
	CLOSF
	 JRST	.+1
LOCNI1:	MOVE	X1,LJFN
	GNJFN
	 RETURN	SKIP,1
	HRRZI	X1,(X1)
	MOVE	X2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCNI1
	SKIPL	VSBUF
	 JRST	LOCNI2
	MOVE	X1,[LFILE,,UBUF1]
	BLT	X1,<UBUF1+SBSIZE-1>
LOCNI2:	HRROI	X1,LFILE
	HRRZ	X2,LJFN
	SETZ	X3,
	JFNS
	MOVE	X1,[LFILE,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,CRLF
	PSOUT
	SKIPL	VSBUF
	 JRST	LOCNI5
	MOVE	X1,[440700,,LFILE]
	MOVE	X2,[440700,,UBUF1]
LOCNI3:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	LOCNI4
	CAIE	X3,";"
	 JUMPN	X3,LOCNI3
	AOS	VBUF
	JRST	LOCNI5
LOCNI4:	MOVN	X1,VSBUF
	MOVEM	X1,VBUF
LOCNI5:	SKIPN	GBUF1
	 JRST	LOCNI6
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,002000
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	LOCNI7
	MOVE	X1,[UBUF2,,FBUF]
	CALLR	LUTVR
LOCNI6:	SKIPN	GBUF2
	 RETURN
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,000200
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	LOCNI7
	MOVE	X1,[UBUF2,,EBUF]
	CALLR	LUTVR
	RETURN
LOCNI7:	HRROI	X1,[ASCIZ/ (Bad remote file name)
/]
	PSOUT
	HRRZ	X1,LJFN
	TLO	X1,400000
	CLOSF
	 JRST	LOCNI1
	JRST	LOCNI1
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	CAMN	X2,VSBUF
	 TRO	X1,100000
	JUMPE	X1,RETN(0)
	MOVE	X2,[POINT 7,LFILE]
	MOVE	X3,[POINT 7,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[POINT 7,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
LOCNO0:	SKIPG	VSBUF
	 RETURN
	MOVEI	X4,";"
	DPB	X4,X2
	MOVE	X1,X2
	MOVE	X2,VSBUF
	MOVEI	X3,↑D10
	NOUT
	 THUD
	ENDR

; LUTVF -- LOCAL UTILITY: VERIFY FILENAME
;   IN: X1 -- POINTER TO STRING TO VERIFY
;
LUTVF:	BEGINR	<X1,X2,X3>
	HRLI	X1,440700
LUTVF0:	ILDB	X2,X1
	JUMPE	X2,RETN(1)
	CAIN	X2,"."
	 JRST	LUTVF0
	CAIN	X2,";"
	 JRST	LUTVF0
	CAIN	X2,"*"
	 JRST	LUTVF0
	CAIN	X2,"V"-100
	 ILDB	X2,X1
	CAIG	X2," "
	 RETURN
	CAIN	X2,"."
	 RETURN
	CAIN	X2,";"
	 RETURN
	CAIN	X2,"*"
	 RETURN
	CAIN	X2,"?"
	 RETURN
	CAIN	X2,":"
	 RETURN
	CAIN	X2,"'"
	 RETURN
	CAIN	X2,42
	 RETURN
	CAIN	X2,"<"
	 RETURN
	CAIN	X2,">"
	 RETURN
	CAIN	X2,177
	 RETURN
	CAIL	X2,"A"+40
	 CAILE	X2,"Z"+40
	  JRST	LUTVF0
	ENDR

; LUTVR -- LOCAL UTILITY: ↑V REMOVAL
;   IN: X1 -- SOURCE,,DESTINATION
;
LUTVR:	BEGINR	<X1,X2,X3>
	HLR	X2,X1
	HRLI	X1,440700
	HRLI	X2,440700
LUTVR0:	ILDB	X3,X2
	CAIN	X3,"V"-100
	 ILDB	X3,X2
	IDPB	X3,X1
	JUMPN	X3,LUTVR0
	ENDR

; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI:	SETOM	FLAGCO
	DEBRK
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	MOVE	UTIL,X1
	HRROI	X1,[ASCIZ/ ?? Unexpected EOF at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JRST	.+1
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	X1,(X2)
	CAMN	X1,[BIN]
	 JRST	EOFPSD
	CAMN	X1,[BOUT]
	 JRST	EOFPSD
	CAMN	X1,[SIN]
	 JRST	EOFPSD
	CAMN	X1,[SOUT]
	 JRST	EOFPSD
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
EOFPSD:	CAMN	UTIL,DCDJFN
	 JRST	.+4
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	MOVEI	X1,QUIT
	MOVEM	X1,PSIPC1
	DEBRK
DERPSI:	MOVE	UTIL,X1
	HRROI	X1,[ASCIZ/ ?? Data error at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JRST	.+1
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	X1,(X2)
	CAMN	X1,[BIN]
	 JRST	DERPSD
	CAMN	X1,[BOUT]
	 JRST	DERPSD
	CAMN	X1,[SIN]
	 JRST	DERPSD
	CAMN	X1,[SOUT]
	 JRST	DERPSD
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
DERPSD:	CAMN	UTIL,DCDJFN
	 JRST	.+4
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	MOVEI	X1,QUIT
	MOVEM	X1,PSIPC1
	DEBRK
ILIPSI:	HRROI	X1,[ASCIZ/ ?? Illegal instruction at /]
	CAMN	X2,[-1]
	 HRROI	X1,[ASCIZ/ ?? Impossible event at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JRST	.+1
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
PSIQUI:	HALTF
	JRST	PSIQUI
>
; (((↑↑↑)))

; ***DATA***

CRLF:	BYTE	(7)15,12,0,0,0
SEMI:	BYTE	(7)";",15,12,0,0

HOSTS:	5,,[ASCIZ/BBN/]			; TENEXE
	11,,[ASCIZ/HARVARD/]
	13,,[ASCIZ/SUAI/]
	37,,[ASCIZ/CCA/]
	40,,[ASCIZ/PARC/]
	43,,[ASCIZ/ISI/]		; ISIR1
	53,,[ASCIZ/OFFICE"-1/]
	56,,[ASCIZ/RUTGERS/]
	61,,[ASCIZ/BBN/]		; TENEXB
	62,,[ASCIZ/BBN/]		; TENEXF
	63,,[ASCIZ/SRI/]		; SRI-KA
	70,,[ASCIZ/SUMEX/]
	102,,[ASCIZ/SRI/]		; SRI-KL
	106,,[ASCIZ/ITS/]		; DMS
	126,,[ASCIZ/ISI/]		; ISIA
	161,,[ASCIZ/BBN/]		; TENEXD
	164,,[ASCIZ/ISI/]		; ISIE
	206,,[ASCIZ/ITS/]		; AI
	226,,[ASCIZ/ISI/]		; ISIC
	305,,[ASCIZ/BBN/]		; TENEXA
	306,,[ASCIZ/ITS/]		; ML
	326,,[ASCIZ/ISI/]		; ISID
	354,,[ASCIZ/ITS/]		; MC
	361,,[ASCIZ/BBN/]		; TENEXC
	364,,[ASCIZ/ISI/]		; ISIB
	0

	LIT			; LITERALS GO HERE

; (((ITS)))
IFL F.TENX,<
IOBUFR:	BLOCK 2000
LCLDEV:	BLOCK 1			; local device
LCLFN1:	BLOCK 1
LCLFN2:	BLOCK 1
LCLSNM:	BLOCK 1			; SNAME
RCHBLK:	BLOCK 10		; network status goes here
LCLRCV:	BLOCK 1
LCLTRN:	BLOCK 1
FORRCV:	BLOCK 1
FORTRN:	BLOCK 1
FFITYP:	BLOCK 1
LCLDAT:	BLOCK 1
DIRBLK:	BLOCK 2000
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
	RELOC	0

; (((NOT SAIL)))
IFE F.SAIL,<
ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
DCDBLK:	SIXBIT	/IMP/
	0
	0			; LOCAL SOCKET (104 RECEIVE, 105 SEND)
	44,,DCHOST		; 36 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP +2 OR +3
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
>
; (((↑↑↑)))
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF
DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

IFE F.SAIL,<
LFILEB:	0,,5			; EXTENDED LOOKUP-ENTER
>
LFIPPN:	0			; PPN
LFILE:	0			; FILE NAME
	0			; EXTENSION AND DATES
	0			; MODE AND DATES
	0			; SIZE IN WORDS
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
LUTDSF:	BLOCK	SBSIZE

; (((SAIL)))
IFN F.SAIL,<
CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2
>
; (((↑↑↑)))
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	1,,TCOPSI
	REPEAT 9,<EXP 0>
	1,,EOFPSI
	1,,DERPSI
	REPEAT 3,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGCO:	0
FLAGEF:	0
FLAGSM:	0
FLAG20:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
DCDJFN:	0			; DC DATA JFN

LFILE:	BLOCK	SBSIZE
LJFN:	0
LDIR:	0

VSBUF:	0

PAGE:	BLOCK	SIZPAG
>
; (((↑↑↑)))

; * VARIABLES

CMDMOD:	0

LHOST:	0

ANCHOR:	ASCIZ	/DFTP/
	BLOCK	<SBSIZE-2>
CONTEX:	BLOCK	LBSIZE
OPENED:	BLOCK	LBSIZE
OPENEM:	0

FLAGDD:	0
FLAGDE:	0
FLAGFE:	0
FLAGNN:	0
FLAGTT:	0

; * BLOCKS

NBUF:	BLOCK	LBSIZE
FBUF:	BLOCK	SBSIZE
EBUF:	BLOCK	SBSIZE
VBUF:	0
FSBUF:	BLOCK	SBSIZE
ESBUF:	BLOCK	SBSIZE

ABUF:	BLOCK	SBSIZE
UBUF1:	BLOCK	LBSIZE
UBUF2:	BLOCK	SBSIZE
GBUF1:	BLOCK	LBSIZE
GBUF2:	BLOCK	LBSIZE

NTIME:	0
NSIZE:	0
NSUM:	0

TCIPCL:	BLOCK	100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK	37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK	STSIZ

	VAR

	-1			; CRETINOUS LINK-10 BUG

	END	DFTP
ββββ